Python: return float 1.0 as int 1 but float 1.5 as float 1.5How to check if a float value is a whole numberChecking if float is equivalent to an integer value in pythonCalling an external command in PythonWhat are metaclasses in Python?Finding the index of an item given a list containing it in PythonHow can I safely create a nested directory in Python?How do I check if a string is a number (float)?How do I parse a string to a float or int in Python?Does Python have a ternary conditional operator?Does Python have a string 'contains' substring method?Catch multiple exceptions in one line (except block)Why is “1000000000000000 in range(1000000000000001)” so fast in Python 3?

How can I hide my bitcoin transactions to protect anonymity from others?

Why don't electron-positron collisions release infinite energy?

Why is "Reports" in sentence down without "The"

What typically incentivizes a professor to change jobs to a lower ranking university?

How is it possible to have an ability score that is less than 3?

declaring a variable twice in IIFE

How can the DM most effectively choose 1 out of an odd number of players to be targeted by an attack or effect?

"which" command doesn't work / path of Safari?

Prevent a directory in /tmp from being deleted

How old can references or sources in a thesis be?

What exactly is the parasitic white layer that forms after iron parts are treated with ammonia?

How did the USSR manage to innovate in an environment characterized by government censorship and high bureaucracy?

How is it possible for user's password to be changed after storage was encrypted? (on OS X, Android)

What are these boxed doors outside store fronts in New York?

Why doesn't Newton's third law mean a person bounces back to where they started when they hit the ground?

What do you call a Matrix-like slowdown and camera movement effect?

How is the claim "I am in New York only if I am in America" the same as "If I am in New York, then I am in America?

When blogging recipes, how can I support both readers who want the narrative/journey and ones who want the printer-friendly recipe?

What is the command to reset a PC without deleting any files

Can a German sentence have two subjects?

Accidentally leaked the solution to an assignment, what to do now? (I'm the prof)

Why is an old chain unsafe?

How do I create uniquely male characters?

What is the offset in a seaplane's hull?



Python: return float 1.0 as int 1 but float 1.5 as float 1.5


How to check if a float value is a whole numberChecking if float is equivalent to an integer value in pythonCalling an external command in PythonWhat are metaclasses in Python?Finding the index of an item given a list containing it in PythonHow can I safely create a nested directory in Python?How do I check if a string is a number (float)?How do I parse a string to a float or int in Python?Does Python have a ternary conditional operator?Does Python have a string 'contains' substring method?Catch multiple exceptions in one line (except block)Why is “1000000000000000 in range(1000000000000001)” so fast in Python 3?






.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty height:90px;width:728px;box-sizing:border-box;








25















In Python is there a way to turn 1.0 into a integer 1 while the same function ignores 1.5 and leaves it as a float?



Right now, int() will turn 1.0 into 1 but it will also round 1.5 down to 1, which is not what I want.










share|improve this question









New contributor




Raymond Shen is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.















  • 4





    one way could be to check the float using is_integer() if that passes, convert it to int?

    – DirtyBit
    Apr 4 at 7:47







  • 5





    Floats are approximations, 1.0 could actually be 1.00000000000001 or 0.999999999999.

    – Barmar
    Apr 4 at 7:49






  • 52





    Why would you want to do this, anyway?

    – Barmar
    Apr 4 at 7:50






  • 5





    Note that because of duck typing, this passage you want to achieve is probably out of place or useless, depending on context.

    – Federico S
    Apr 4 at 7:52






  • 11





    Please specify your exact requirements in words/rules rather than just with a single example!

    – Lightness Races in Orbit
    Apr 4 at 10:35

















25















In Python is there a way to turn 1.0 into a integer 1 while the same function ignores 1.5 and leaves it as a float?



Right now, int() will turn 1.0 into 1 but it will also round 1.5 down to 1, which is not what I want.










share|improve this question









New contributor




Raymond Shen is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.















  • 4





    one way could be to check the float using is_integer() if that passes, convert it to int?

    – DirtyBit
    Apr 4 at 7:47







  • 5





    Floats are approximations, 1.0 could actually be 1.00000000000001 or 0.999999999999.

    – Barmar
    Apr 4 at 7:49






  • 52





    Why would you want to do this, anyway?

    – Barmar
    Apr 4 at 7:50






  • 5





    Note that because of duck typing, this passage you want to achieve is probably out of place or useless, depending on context.

    – Federico S
    Apr 4 at 7:52






  • 11





    Please specify your exact requirements in words/rules rather than just with a single example!

    – Lightness Races in Orbit
    Apr 4 at 10:35













25












25








25


3






In Python is there a way to turn 1.0 into a integer 1 while the same function ignores 1.5 and leaves it as a float?



Right now, int() will turn 1.0 into 1 but it will also round 1.5 down to 1, which is not what I want.










share|improve this question









New contributor




Raymond Shen is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.












In Python is there a way to turn 1.0 into a integer 1 while the same function ignores 1.5 and leaves it as a float?



Right now, int() will turn 1.0 into 1 but it will also round 1.5 down to 1, which is not what I want.







python






share|improve this question









New contributor




Raymond Shen is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.











share|improve this question









New contributor




Raymond Shen is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.









share|improve this question




share|improve this question








edited Apr 4 at 14:52









DirtyBit

12.3k31943




12.3k31943






New contributor




Raymond Shen is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.









asked Apr 4 at 7:46









Raymond ShenRaymond Shen

15024




15024




New contributor




Raymond Shen is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.





New contributor





Raymond Shen is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.






Raymond Shen is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.







  • 4





    one way could be to check the float using is_integer() if that passes, convert it to int?

    – DirtyBit
    Apr 4 at 7:47







  • 5





    Floats are approximations, 1.0 could actually be 1.00000000000001 or 0.999999999999.

    – Barmar
    Apr 4 at 7:49






  • 52





    Why would you want to do this, anyway?

    – Barmar
    Apr 4 at 7:50






  • 5





    Note that because of duck typing, this passage you want to achieve is probably out of place or useless, depending on context.

    – Federico S
    Apr 4 at 7:52






  • 11





    Please specify your exact requirements in words/rules rather than just with a single example!

    – Lightness Races in Orbit
    Apr 4 at 10:35












  • 4





    one way could be to check the float using is_integer() if that passes, convert it to int?

    – DirtyBit
    Apr 4 at 7:47







  • 5





    Floats are approximations, 1.0 could actually be 1.00000000000001 or 0.999999999999.

    – Barmar
    Apr 4 at 7:49






  • 52





    Why would you want to do this, anyway?

    – Barmar
    Apr 4 at 7:50






  • 5





    Note that because of duck typing, this passage you want to achieve is probably out of place or useless, depending on context.

    – Federico S
    Apr 4 at 7:52






  • 11





    Please specify your exact requirements in words/rules rather than just with a single example!

    – Lightness Races in Orbit
    Apr 4 at 10:35







4




4





one way could be to check the float using is_integer() if that passes, convert it to int?

– DirtyBit
Apr 4 at 7:47






one way could be to check the float using is_integer() if that passes, convert it to int?

– DirtyBit
Apr 4 at 7:47





5




5





Floats are approximations, 1.0 could actually be 1.00000000000001 or 0.999999999999.

– Barmar
Apr 4 at 7:49





Floats are approximations, 1.0 could actually be 1.00000000000001 or 0.999999999999.

– Barmar
Apr 4 at 7:49




52




52





Why would you want to do this, anyway?

– Barmar
Apr 4 at 7:50





Why would you want to do this, anyway?

– Barmar
Apr 4 at 7:50




5




5





Note that because of duck typing, this passage you want to achieve is probably out of place or useless, depending on context.

– Federico S
Apr 4 at 7:52





Note that because of duck typing, this passage you want to achieve is probably out of place or useless, depending on context.

– Federico S
Apr 4 at 7:52




11




11





Please specify your exact requirements in words/rules rather than just with a single example!

– Lightness Races in Orbit
Apr 4 at 10:35





Please specify your exact requirements in words/rules rather than just with a single example!

– Lightness Races in Orbit
Apr 4 at 10:35












9 Answers
9






active

oldest

votes


















71














Continuing from the comments above:



Using is_integer():



Example from the docs:



>>> (1.5).is_integer()
False
>>> (1.0).is_integer()
True
>>> (1.4142135623730951).is_integer()
False
>>> (-2.0).is_integer()
True
>>> (3.2).is_integer()
False


INPUT:



s = [1.5, 1.0, 2.5, 3.54, 1.0, 4.4, 2.0]


Hence:



print([int(x) if x.is_integer() else x for x in s])


Wrapped in a function:



def func(s):
return [int(x) if x.is_integer() else x for x in s]

print(func(s))


If you do not want any import:



def func(s):
return [int(x) if x == int(x) else x for x in s]

print(func(s))


Using map() with lambda function and the iter s:



print(list(map(lambda x: int(x) if x.is_integer() else x, s)))


OR



print(list(map(lambda x: int(x) if int(x) == x else x, s)))


OUTPUT:



[1.5, 1, 2.5, 3.54, 1, 4.4, 2]





share|improve this answer




















  • 13





    If anyone is curious about about the limits of is_integer() and how far away from 1.0 a floating point number can be and still be considered an integer, I wrote a short script to find the limit. It's a very small number, much more precision than I have ever needed for anything. (1.0 + 1.1102230246251566636831481088739149080825883254353483864385054857848444953560829162597656251e-16).is_integer() returns False, but (1.0 + 1.1102230246251566636831481088739149080825883254353483864385054857848444953560829162597656250e-16).is_integer() returns True.

    – Josh Davis
    Apr 4 at 18:33






  • 21





    @JoshDavis That's just about rounding to 1.0 vs. 1.0 + sys.float_info.epsilon.

    – LegionMammal978
    Apr 4 at 19:55







  • 2





    @RomanOdaisky Lmao. I both hate and love language quirks like this. On the one hand they produce cryptic code, but on the other hand they make for great "how well do you know this language" quizzes.

    – flakes
    Apr 4 at 23:57






  • 4





    @flakes: If that makes you angry, I feel compelled to point out that 1.bit_length() is illegal, but 1 .bit_length() (with a space after the 1, before the .) works perfectly. :-)

    – ShadowRanger
    2 days ago







  • 4





    @accdias: That won't always work either, since float has representational limits while int does not. Passing x = 1 << 1024 will cause your code to die with an OverflowError. So now you've got additional checks for safety, or exception handling.

    – ShadowRanger
    2 days ago


















26














In case your goal is to convert numbers to a concise string, you could simply use '%g' ("General Format") for formatting:



>>> '%g' % 1.0
'1'
>>> '%g' % 1
'1'
>>> '%g' % 1.5
'1.5'
>>> '%g' % 0.3
'0.3'
>>> '%g' % 0.9999999999
'1'


You can specify the desired accuracy:



>>> '%.15g' % 0.999999999999999
'0.999999999999999'
>>> '%.2g' % 0.999
'1'





share|improve this answer

























  • This is great but I had a query yesterday that for some reason I couldn't ask, this would turn 0.9 to 1 but considering one only wants 1.0 to 1 or 2.0 to 2 and not 0.9 to 1 or 1.9 to 2. Do we have a workabout in that case? cheers!

    – DirtyBit
    2 days ago












  • @DirtyBit: Sorry, I really don't understand the question. '%g' % 0.9 is '0.9' and '%g' % 2.0 is '2'. Floats are displayed as ints only if they're really close to an int, e.g. 0.9999995. But not 0.9 or 0.99

    – Eric Duminil
    2 days ago











  • exactly: print('%g' % 0.9999999999) # 1 but let's say the req. was to only have 1 if it was 1.0 and not 0.9999999999?

    – DirtyBit
    2 days ago







  • 2





    @DirtyBit: You can specify the desired accuracy : '%.15g' % 0.999999999999999 is '0.999999999999999' and '%.2g' % 0.999is '1'. From this article : Rounding error is the characteristic feature of floating-point computation.

    – Eric Duminil
    2 days ago






  • 1





    Best answer since this is the only valid use case for what the OP wants anyway.

    – jpmc26
    15 hours ago


















10














float.is_integer is a method on floats that returns whether or not the float represents an integer.



You can just use this function I made called to_int, that uses is_integer to check whether it represents an integer (e.g. 1.0) or not (e.g. 1.5).



If it represents an integer, return int(a), otherwise just return it's original value.



As you see, I am not using elif or else because return exits the function:



def to_int(a):
if a.is_integer():
return int(a)
return a

print(to_int(1.5))
print(to_int(1.0))


Output:



1.5
1





share|improve this answer
































    5














    Python floats are approximations, so something that prints as 1.0 is not necessarily exactly 1.0. If you want to see if something is approximately an integer, use a sufficiently small epsilon value.



    EPSILON = 0.0001 # Make this smaller or larger depending on desired accuracy

    def func(x):
    if abs(x - round(x)) < EPSILON:
    return round(x)
    else:
    return x


    In general, if you're checking whether a float is == to something, that tends to be a code smell, as floating point values are inherently approximate. It's more appropriate in general to check whether a float is near something, within some epsilon range.






    share|improve this answer




















    • 3





      While most floating point values are approximations, there are many integers that can be represented exactly. A 64-bit IEEE 754 floating point number (as used in Python and other languages) can represent exactly any signed integer that fits in 53 bits or less. Such integers can be converted 1 to 1 between a 64-bit float and 64-bit integer assuming the integer value could be represented with as little as 53 bits. Addition, subtraction, and multiplication that stays within 53-bits of integer space should yield identical results per IEEE 754 spec.

      – penguin359
      Apr 4 at 18:04






    • 1





      @penguin359 While I agree that integers can be represented exactly in floating point, if you're in the situation that OP is in, you need to ask yourself how close to an integer is "close enough" for your purpose. Is 1.0 + 1e-16 "close enough"? Is 1.0 + 2e-16? It's an important question, as IEEE 754-based "is integer" methods will treat them differently, and you may or may not want to consider 1.0 + 2e-16 "not an integer" while saying 1.0 + 1e-16 is one. -- Having an explicit epsilon (versus the implicit one from IEEE 754) makes your desires clearer.

      – R.M.
      Apr 4 at 19:30











    • A comment seeming best at this answer: Setting an epsilon works as in the example provided works fine. Alternatively, especially if dealing with cents (currencies in general), I found it more useful to change from Python's default of binary representation to decimal one, as provided by module decimal (docs.python.org/3.7/library/decimal.html). The difference, for example in a loop iterating from -1 to +1 in increments of 0.1 is either passing very close to 0, or right at 0.0 -- without need for an epsilon set (how would you deal with -1.3877787807814457e-16 currency units?).

      – Buttonwood
      Apr 4 at 19:39






    • 1





      "so something that prints as 1.0 is not necessarily exactly 1.0" That depends on the version of python. In modern python3 (IIRC since python 3.2) a float that prints as 1.0 is exactly 1.0. In older versions of python it may not be. Try "print (float(numpy.nextafter(1.0,2)))" to see what happens on your version.

      – plugwash
      2 days ago


















    1














    What I used to do in the past in C++ is, lets say you have these variables:



    float x = 1.5;
    float y = 1.0;


    Then you could do something like this:



    if(x == (int)x) 
    return 1;
    else return 0;


    This will return 0 because 1.5 is not equal to 1



    if(y == (int)y) 
    return 1;
    else return 0;


    This will return 1 because 1.0 is equal to 1



    Of course your question is about Python and the function is_integer() should work great, I just thought some people might find this useful.






    share|improve this answer








    New contributor




    Stefan Kostoski is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
    Check out our Code of Conduct.















    • 1





      The question was to convert a float to int whenever the float in question has an integer value. AFAIK this is not possible in C++, because you cannot return different values from a function.

      – M.Herzkamp
      Apr 4 at 11:49






    • 3





      @M.Herzkamp you could have a union though.

      – Baldrickk
      Apr 4 at 12:13











    • And also you could set another integer variable and save the float there if the condition above is met

      – Stefan Kostoski
      Apr 4 at 12:40











    • The digression on C++ isn't really relevant. You can do the same thing in Python: foo = lambda x: int(x) if int(x) == x else x. (Or in Python 3.8, to avoid the duplicate call to int, lambda x: y if (y:=int(x)) == x else x.

      – chepner
      Apr 4 at 13:11











    • @chepner I tried foo = lambda x: int(x) if int(x) == x else x the very moment I wrote the answer above, for some reason it did not work for me in 3.6. Any clue?

      – DirtyBit
      Apr 4 at 13:18


















    0














    A safe approach using lambda and is_integer():



    >>> to_int = lambda x: int(x) if float(x).is_integer() else x
    >>> to_int(1)
    1
    >>> to_int(1.0)
    1
    >>> to_int(1.2)
    1.2
    >>>





    share|improve this answer


















    • 1





      Why do you use a lambda instead of a function? Especially since you name your lambda?

      – Eric Duminil
      2 days ago











    • There is no special reason. I guess it just makes it easier to use everywhere else.

      – accdias
      2 days ago






    • 2





      Okay. I meant to say that you could use def to_int(x): return int(x) if float(x).is_integer() else x instead. A lambda is an anonymous function. So a named lambda is just a function.

      – Eric Duminil
      2 days ago











    • @EricDumini, I see your point.

      – accdias
      2 days ago


















    0














    for list of numbers:



    def get_int_if_possible(list_of_numbers):
    return [int(x) if x == int(x) else x for x in list_of_numbers]


    for one number:



    def get_int_if_possible(number):
    return int(number) if number == int(number) else number





    share|improve this answer






























      -1














      use .strip('.0') could get wrong if your variable is 0.999999



      >>> data = [1.0, 1, 1.5, 0.9999999999]
      >>> data = [str(x) for x in data]
      >>>
      >>> def func(s):
      ... s = [x.strip('.0') for x in s]
      ... return [float(x) if x == x.strip('.0') else x for x in s]
      ...
      >>> print(func(data))
      [1.0, 1.0, 1.5, 9999999999.0]





      share|improve this answer








      New contributor




      Spinel is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.



























        -2














        A simple thing you could do is use the modulo operator:



        if (myFloat % 1 == 0) // Number is an int
        else // numer is not an int


        (Note: Not real code (although compilable with some languages)!)



        EDIT:
        Thanks to "popular demand" here's some Python code (untested):



        if myFloat % 1 = 0:
        # Is an integer
        return int(myFloat)
        else:
        # Is not an integer
        return myFloat


        Again, the code is untested, but I think it should work (not too familiar w/ Python, tbh)






        share|improve this answer




















        • 2





          I'm sorry but that is not a valid Python structure, would you please have it a valid Python format or allow me to edit it for you?

          – DirtyBit
          Apr 4 at 11:21






        • 2





          As he mentioned, this is simply a logic. Not a working code. This should be fine IMO.

          – Amit Joshi
          Apr 4 at 12:49






        • 4





          And readers should also google why it isn't possible to use return outside of a function, or what the difference between == and = is?

          – Eric Duminil
          Apr 4 at 13:32






        • 8





          To avoid downvotes, you should either try to answer questions for languages you're familiar with or at the very least try to run your code before posting.

          – Eric Duminil
          Apr 4 at 13:44






        • 2





          @SimonC: Python syntax is close enough to pseudo-code that it doesn't really make sense to write pseudo-code for Python IMHO. Feel free to edit your answer with a correct Python syntax and I'd be happy to revert my downvote.

          – Eric Duminil
          2 days ago











        Your Answer






        StackExchange.ifUsing("editor", function ()
        StackExchange.using("externalEditor", function ()
        StackExchange.using("snippets", function ()
        StackExchange.snippets.init();
        );
        );
        , "code-snippets");

        StackExchange.ready(function()
        var channelOptions =
        tags: "".split(" "),
        id: "1"
        ;
        initTagRenderer("".split(" "), "".split(" "), channelOptions);

        StackExchange.using("externalEditor", function()
        // Have to fire editor after snippets, if snippets enabled
        if (StackExchange.settings.snippets.snippetsEnabled)
        StackExchange.using("snippets", function()
        createEditor();
        );

        else
        createEditor();

        );

        function createEditor()
        StackExchange.prepareEditor(
        heartbeatType: 'answer',
        autoActivateHeartbeat: false,
        convertImagesToLinks: true,
        noModals: true,
        showLowRepImageUploadWarning: true,
        reputationToPostImages: 10,
        bindNavPrevention: true,
        postfix: "",
        imageUploader:
        brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
        contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
        allowUrls: true
        ,
        onDemand: true,
        discardSelector: ".discard-answer"
        ,immediatelyShowMarkdownHelp:true
        );



        );






        Raymond Shen is a new contributor. Be nice, and check out our Code of Conduct.









        draft saved

        draft discarded


















        StackExchange.ready(
        function ()
        StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55510485%2fpython-return-float-1-0-as-int-1-but-float-1-5-as-float-1-5%23new-answer', 'question_page');

        );

        Post as a guest















        Required, but never shown

























        9 Answers
        9






        active

        oldest

        votes








        9 Answers
        9






        active

        oldest

        votes









        active

        oldest

        votes






        active

        oldest

        votes









        71














        Continuing from the comments above:



        Using is_integer():



        Example from the docs:



        >>> (1.5).is_integer()
        False
        >>> (1.0).is_integer()
        True
        >>> (1.4142135623730951).is_integer()
        False
        >>> (-2.0).is_integer()
        True
        >>> (3.2).is_integer()
        False


        INPUT:



        s = [1.5, 1.0, 2.5, 3.54, 1.0, 4.4, 2.0]


        Hence:



        print([int(x) if x.is_integer() else x for x in s])


        Wrapped in a function:



        def func(s):
        return [int(x) if x.is_integer() else x for x in s]

        print(func(s))


        If you do not want any import:



        def func(s):
        return [int(x) if x == int(x) else x for x in s]

        print(func(s))


        Using map() with lambda function and the iter s:



        print(list(map(lambda x: int(x) if x.is_integer() else x, s)))


        OR



        print(list(map(lambda x: int(x) if int(x) == x else x, s)))


        OUTPUT:



        [1.5, 1, 2.5, 3.54, 1, 4.4, 2]





        share|improve this answer




















        • 13





          If anyone is curious about about the limits of is_integer() and how far away from 1.0 a floating point number can be and still be considered an integer, I wrote a short script to find the limit. It's a very small number, much more precision than I have ever needed for anything. (1.0 + 1.1102230246251566636831481088739149080825883254353483864385054857848444953560829162597656251e-16).is_integer() returns False, but (1.0 + 1.1102230246251566636831481088739149080825883254353483864385054857848444953560829162597656250e-16).is_integer() returns True.

          – Josh Davis
          Apr 4 at 18:33






        • 21





          @JoshDavis That's just about rounding to 1.0 vs. 1.0 + sys.float_info.epsilon.

          – LegionMammal978
          Apr 4 at 19:55







        • 2





          @RomanOdaisky Lmao. I both hate and love language quirks like this. On the one hand they produce cryptic code, but on the other hand they make for great "how well do you know this language" quizzes.

          – flakes
          Apr 4 at 23:57






        • 4





          @flakes: If that makes you angry, I feel compelled to point out that 1.bit_length() is illegal, but 1 .bit_length() (with a space after the 1, before the .) works perfectly. :-)

          – ShadowRanger
          2 days ago







        • 4





          @accdias: That won't always work either, since float has representational limits while int does not. Passing x = 1 << 1024 will cause your code to die with an OverflowError. So now you've got additional checks for safety, or exception handling.

          – ShadowRanger
          2 days ago















        71














        Continuing from the comments above:



        Using is_integer():



        Example from the docs:



        >>> (1.5).is_integer()
        False
        >>> (1.0).is_integer()
        True
        >>> (1.4142135623730951).is_integer()
        False
        >>> (-2.0).is_integer()
        True
        >>> (3.2).is_integer()
        False


        INPUT:



        s = [1.5, 1.0, 2.5, 3.54, 1.0, 4.4, 2.0]


        Hence:



        print([int(x) if x.is_integer() else x for x in s])


        Wrapped in a function:



        def func(s):
        return [int(x) if x.is_integer() else x for x in s]

        print(func(s))


        If you do not want any import:



        def func(s):
        return [int(x) if x == int(x) else x for x in s]

        print(func(s))


        Using map() with lambda function and the iter s:



        print(list(map(lambda x: int(x) if x.is_integer() else x, s)))


        OR



        print(list(map(lambda x: int(x) if int(x) == x else x, s)))


        OUTPUT:



        [1.5, 1, 2.5, 3.54, 1, 4.4, 2]





        share|improve this answer




















        • 13





          If anyone is curious about about the limits of is_integer() and how far away from 1.0 a floating point number can be and still be considered an integer, I wrote a short script to find the limit. It's a very small number, much more precision than I have ever needed for anything. (1.0 + 1.1102230246251566636831481088739149080825883254353483864385054857848444953560829162597656251e-16).is_integer() returns False, but (1.0 + 1.1102230246251566636831481088739149080825883254353483864385054857848444953560829162597656250e-16).is_integer() returns True.

          – Josh Davis
          Apr 4 at 18:33






        • 21





          @JoshDavis That's just about rounding to 1.0 vs. 1.0 + sys.float_info.epsilon.

          – LegionMammal978
          Apr 4 at 19:55







        • 2





          @RomanOdaisky Lmao. I both hate and love language quirks like this. On the one hand they produce cryptic code, but on the other hand they make for great "how well do you know this language" quizzes.

          – flakes
          Apr 4 at 23:57






        • 4





          @flakes: If that makes you angry, I feel compelled to point out that 1.bit_length() is illegal, but 1 .bit_length() (with a space after the 1, before the .) works perfectly. :-)

          – ShadowRanger
          2 days ago







        • 4





          @accdias: That won't always work either, since float has representational limits while int does not. Passing x = 1 << 1024 will cause your code to die with an OverflowError. So now you've got additional checks for safety, or exception handling.

          – ShadowRanger
          2 days ago













        71












        71








        71







        Continuing from the comments above:



        Using is_integer():



        Example from the docs:



        >>> (1.5).is_integer()
        False
        >>> (1.0).is_integer()
        True
        >>> (1.4142135623730951).is_integer()
        False
        >>> (-2.0).is_integer()
        True
        >>> (3.2).is_integer()
        False


        INPUT:



        s = [1.5, 1.0, 2.5, 3.54, 1.0, 4.4, 2.0]


        Hence:



        print([int(x) if x.is_integer() else x for x in s])


        Wrapped in a function:



        def func(s):
        return [int(x) if x.is_integer() else x for x in s]

        print(func(s))


        If you do not want any import:



        def func(s):
        return [int(x) if x == int(x) else x for x in s]

        print(func(s))


        Using map() with lambda function and the iter s:



        print(list(map(lambda x: int(x) if x.is_integer() else x, s)))


        OR



        print(list(map(lambda x: int(x) if int(x) == x else x, s)))


        OUTPUT:



        [1.5, 1, 2.5, 3.54, 1, 4.4, 2]





        share|improve this answer















        Continuing from the comments above:



        Using is_integer():



        Example from the docs:



        >>> (1.5).is_integer()
        False
        >>> (1.0).is_integer()
        True
        >>> (1.4142135623730951).is_integer()
        False
        >>> (-2.0).is_integer()
        True
        >>> (3.2).is_integer()
        False


        INPUT:



        s = [1.5, 1.0, 2.5, 3.54, 1.0, 4.4, 2.0]


        Hence:



        print([int(x) if x.is_integer() else x for x in s])


        Wrapped in a function:



        def func(s):
        return [int(x) if x.is_integer() else x for x in s]

        print(func(s))


        If you do not want any import:



        def func(s):
        return [int(x) if x == int(x) else x for x in s]

        print(func(s))


        Using map() with lambda function and the iter s:



        print(list(map(lambda x: int(x) if x.is_integer() else x, s)))


        OR



        print(list(map(lambda x: int(x) if int(x) == x else x, s)))


        OUTPUT:



        [1.5, 1, 2.5, 3.54, 1, 4.4, 2]






        share|improve this answer














        share|improve this answer



        share|improve this answer








        edited 17 hours ago

























        answered Apr 4 at 7:49









        DirtyBitDirtyBit

        12.3k31943




        12.3k31943







        • 13





          If anyone is curious about about the limits of is_integer() and how far away from 1.0 a floating point number can be and still be considered an integer, I wrote a short script to find the limit. It's a very small number, much more precision than I have ever needed for anything. (1.0 + 1.1102230246251566636831481088739149080825883254353483864385054857848444953560829162597656251e-16).is_integer() returns False, but (1.0 + 1.1102230246251566636831481088739149080825883254353483864385054857848444953560829162597656250e-16).is_integer() returns True.

          – Josh Davis
          Apr 4 at 18:33






        • 21





          @JoshDavis That's just about rounding to 1.0 vs. 1.0 + sys.float_info.epsilon.

          – LegionMammal978
          Apr 4 at 19:55







        • 2





          @RomanOdaisky Lmao. I both hate and love language quirks like this. On the one hand they produce cryptic code, but on the other hand they make for great "how well do you know this language" quizzes.

          – flakes
          Apr 4 at 23:57






        • 4





          @flakes: If that makes you angry, I feel compelled to point out that 1.bit_length() is illegal, but 1 .bit_length() (with a space after the 1, before the .) works perfectly. :-)

          – ShadowRanger
          2 days ago







        • 4





          @accdias: That won't always work either, since float has representational limits while int does not. Passing x = 1 << 1024 will cause your code to die with an OverflowError. So now you've got additional checks for safety, or exception handling.

          – ShadowRanger
          2 days ago












        • 13





          If anyone is curious about about the limits of is_integer() and how far away from 1.0 a floating point number can be and still be considered an integer, I wrote a short script to find the limit. It's a very small number, much more precision than I have ever needed for anything. (1.0 + 1.1102230246251566636831481088739149080825883254353483864385054857848444953560829162597656251e-16).is_integer() returns False, but (1.0 + 1.1102230246251566636831481088739149080825883254353483864385054857848444953560829162597656250e-16).is_integer() returns True.

          – Josh Davis
          Apr 4 at 18:33






        • 21





          @JoshDavis That's just about rounding to 1.0 vs. 1.0 + sys.float_info.epsilon.

          – LegionMammal978
          Apr 4 at 19:55







        • 2





          @RomanOdaisky Lmao. I both hate and love language quirks like this. On the one hand they produce cryptic code, but on the other hand they make for great "how well do you know this language" quizzes.

          – flakes
          Apr 4 at 23:57






        • 4





          @flakes: If that makes you angry, I feel compelled to point out that 1.bit_length() is illegal, but 1 .bit_length() (with a space after the 1, before the .) works perfectly. :-)

          – ShadowRanger
          2 days ago







        • 4





          @accdias: That won't always work either, since float has representational limits while int does not. Passing x = 1 << 1024 will cause your code to die with an OverflowError. So now you've got additional checks for safety, or exception handling.

          – ShadowRanger
          2 days ago







        13




        13





        If anyone is curious about about the limits of is_integer() and how far away from 1.0 a floating point number can be and still be considered an integer, I wrote a short script to find the limit. It's a very small number, much more precision than I have ever needed for anything. (1.0 + 1.1102230246251566636831481088739149080825883254353483864385054857848444953560829162597656251e-16).is_integer() returns False, but (1.0 + 1.1102230246251566636831481088739149080825883254353483864385054857848444953560829162597656250e-16).is_integer() returns True.

        – Josh Davis
        Apr 4 at 18:33





        If anyone is curious about about the limits of is_integer() and how far away from 1.0 a floating point number can be and still be considered an integer, I wrote a short script to find the limit. It's a very small number, much more precision than I have ever needed for anything. (1.0 + 1.1102230246251566636831481088739149080825883254353483864385054857848444953560829162597656251e-16).is_integer() returns False, but (1.0 + 1.1102230246251566636831481088739149080825883254353483864385054857848444953560829162597656250e-16).is_integer() returns True.

        – Josh Davis
        Apr 4 at 18:33




        21




        21





        @JoshDavis That's just about rounding to 1.0 vs. 1.0 + sys.float_info.epsilon.

        – LegionMammal978
        Apr 4 at 19:55






        @JoshDavis That's just about rounding to 1.0 vs. 1.0 + sys.float_info.epsilon.

        – LegionMammal978
        Apr 4 at 19:55





        2




        2





        @RomanOdaisky Lmao. I both hate and love language quirks like this. On the one hand they produce cryptic code, but on the other hand they make for great "how well do you know this language" quizzes.

        – flakes
        Apr 4 at 23:57





        @RomanOdaisky Lmao. I both hate and love language quirks like this. On the one hand they produce cryptic code, but on the other hand they make for great "how well do you know this language" quizzes.

        – flakes
        Apr 4 at 23:57




        4




        4





        @flakes: If that makes you angry, I feel compelled to point out that 1.bit_length() is illegal, but 1 .bit_length() (with a space after the 1, before the .) works perfectly. :-)

        – ShadowRanger
        2 days ago






        @flakes: If that makes you angry, I feel compelled to point out that 1.bit_length() is illegal, but 1 .bit_length() (with a space after the 1, before the .) works perfectly. :-)

        – ShadowRanger
        2 days ago





        4




        4





        @accdias: That won't always work either, since float has representational limits while int does not. Passing x = 1 << 1024 will cause your code to die with an OverflowError. So now you've got additional checks for safety, or exception handling.

        – ShadowRanger
        2 days ago





        @accdias: That won't always work either, since float has representational limits while int does not. Passing x = 1 << 1024 will cause your code to die with an OverflowError. So now you've got additional checks for safety, or exception handling.

        – ShadowRanger
        2 days ago













        26














        In case your goal is to convert numbers to a concise string, you could simply use '%g' ("General Format") for formatting:



        >>> '%g' % 1.0
        '1'
        >>> '%g' % 1
        '1'
        >>> '%g' % 1.5
        '1.5'
        >>> '%g' % 0.3
        '0.3'
        >>> '%g' % 0.9999999999
        '1'


        You can specify the desired accuracy:



        >>> '%.15g' % 0.999999999999999
        '0.999999999999999'
        >>> '%.2g' % 0.999
        '1'





        share|improve this answer

























        • This is great but I had a query yesterday that for some reason I couldn't ask, this would turn 0.9 to 1 but considering one only wants 1.0 to 1 or 2.0 to 2 and not 0.9 to 1 or 1.9 to 2. Do we have a workabout in that case? cheers!

          – DirtyBit
          2 days ago












        • @DirtyBit: Sorry, I really don't understand the question. '%g' % 0.9 is '0.9' and '%g' % 2.0 is '2'. Floats are displayed as ints only if they're really close to an int, e.g. 0.9999995. But not 0.9 or 0.99

          – Eric Duminil
          2 days ago











        • exactly: print('%g' % 0.9999999999) # 1 but let's say the req. was to only have 1 if it was 1.0 and not 0.9999999999?

          – DirtyBit
          2 days ago







        • 2





          @DirtyBit: You can specify the desired accuracy : '%.15g' % 0.999999999999999 is '0.999999999999999' and '%.2g' % 0.999is '1'. From this article : Rounding error is the characteristic feature of floating-point computation.

          – Eric Duminil
          2 days ago






        • 1





          Best answer since this is the only valid use case for what the OP wants anyway.

          – jpmc26
          15 hours ago















        26














        In case your goal is to convert numbers to a concise string, you could simply use '%g' ("General Format") for formatting:



        >>> '%g' % 1.0
        '1'
        >>> '%g' % 1
        '1'
        >>> '%g' % 1.5
        '1.5'
        >>> '%g' % 0.3
        '0.3'
        >>> '%g' % 0.9999999999
        '1'


        You can specify the desired accuracy:



        >>> '%.15g' % 0.999999999999999
        '0.999999999999999'
        >>> '%.2g' % 0.999
        '1'





        share|improve this answer

























        • This is great but I had a query yesterday that for some reason I couldn't ask, this would turn 0.9 to 1 but considering one only wants 1.0 to 1 or 2.0 to 2 and not 0.9 to 1 or 1.9 to 2. Do we have a workabout in that case? cheers!

          – DirtyBit
          2 days ago












        • @DirtyBit: Sorry, I really don't understand the question. '%g' % 0.9 is '0.9' and '%g' % 2.0 is '2'. Floats are displayed as ints only if they're really close to an int, e.g. 0.9999995. But not 0.9 or 0.99

          – Eric Duminil
          2 days ago











        • exactly: print('%g' % 0.9999999999) # 1 but let's say the req. was to only have 1 if it was 1.0 and not 0.9999999999?

          – DirtyBit
          2 days ago







        • 2





          @DirtyBit: You can specify the desired accuracy : '%.15g' % 0.999999999999999 is '0.999999999999999' and '%.2g' % 0.999is '1'. From this article : Rounding error is the characteristic feature of floating-point computation.

          – Eric Duminil
          2 days ago






        • 1





          Best answer since this is the only valid use case for what the OP wants anyway.

          – jpmc26
          15 hours ago













        26












        26








        26







        In case your goal is to convert numbers to a concise string, you could simply use '%g' ("General Format") for formatting:



        >>> '%g' % 1.0
        '1'
        >>> '%g' % 1
        '1'
        >>> '%g' % 1.5
        '1.5'
        >>> '%g' % 0.3
        '0.3'
        >>> '%g' % 0.9999999999
        '1'


        You can specify the desired accuracy:



        >>> '%.15g' % 0.999999999999999
        '0.999999999999999'
        >>> '%.2g' % 0.999
        '1'





        share|improve this answer















        In case your goal is to convert numbers to a concise string, you could simply use '%g' ("General Format") for formatting:



        >>> '%g' % 1.0
        '1'
        >>> '%g' % 1
        '1'
        >>> '%g' % 1.5
        '1.5'
        >>> '%g' % 0.3
        '0.3'
        >>> '%g' % 0.9999999999
        '1'


        You can specify the desired accuracy:



        >>> '%.15g' % 0.999999999999999
        '0.999999999999999'
        >>> '%.2g' % 0.999
        '1'






        share|improve this answer














        share|improve this answer



        share|improve this answer








        edited 2 days ago

























        answered Apr 4 at 12:23









        Eric DuminilEric Duminil

        40.9k63472




        40.9k63472












        • This is great but I had a query yesterday that for some reason I couldn't ask, this would turn 0.9 to 1 but considering one only wants 1.0 to 1 or 2.0 to 2 and not 0.9 to 1 or 1.9 to 2. Do we have a workabout in that case? cheers!

          – DirtyBit
          2 days ago












        • @DirtyBit: Sorry, I really don't understand the question. '%g' % 0.9 is '0.9' and '%g' % 2.0 is '2'. Floats are displayed as ints only if they're really close to an int, e.g. 0.9999995. But not 0.9 or 0.99

          – Eric Duminil
          2 days ago











        • exactly: print('%g' % 0.9999999999) # 1 but let's say the req. was to only have 1 if it was 1.0 and not 0.9999999999?

          – DirtyBit
          2 days ago







        • 2





          @DirtyBit: You can specify the desired accuracy : '%.15g' % 0.999999999999999 is '0.999999999999999' and '%.2g' % 0.999is '1'. From this article : Rounding error is the characteristic feature of floating-point computation.

          – Eric Duminil
          2 days ago






        • 1





          Best answer since this is the only valid use case for what the OP wants anyway.

          – jpmc26
          15 hours ago

















        • This is great but I had a query yesterday that for some reason I couldn't ask, this would turn 0.9 to 1 but considering one only wants 1.0 to 1 or 2.0 to 2 and not 0.9 to 1 or 1.9 to 2. Do we have a workabout in that case? cheers!

          – DirtyBit
          2 days ago












        • @DirtyBit: Sorry, I really don't understand the question. '%g' % 0.9 is '0.9' and '%g' % 2.0 is '2'. Floats are displayed as ints only if they're really close to an int, e.g. 0.9999995. But not 0.9 or 0.99

          – Eric Duminil
          2 days ago











        • exactly: print('%g' % 0.9999999999) # 1 but let's say the req. was to only have 1 if it was 1.0 and not 0.9999999999?

          – DirtyBit
          2 days ago







        • 2





          @DirtyBit: You can specify the desired accuracy : '%.15g' % 0.999999999999999 is '0.999999999999999' and '%.2g' % 0.999is '1'. From this article : Rounding error is the characteristic feature of floating-point computation.

          – Eric Duminil
          2 days ago






        • 1





          Best answer since this is the only valid use case for what the OP wants anyway.

          – jpmc26
          15 hours ago
















        This is great but I had a query yesterday that for some reason I couldn't ask, this would turn 0.9 to 1 but considering one only wants 1.0 to 1 or 2.0 to 2 and not 0.9 to 1 or 1.9 to 2. Do we have a workabout in that case? cheers!

        – DirtyBit
        2 days ago






        This is great but I had a query yesterday that for some reason I couldn't ask, this would turn 0.9 to 1 but considering one only wants 1.0 to 1 or 2.0 to 2 and not 0.9 to 1 or 1.9 to 2. Do we have a workabout in that case? cheers!

        – DirtyBit
        2 days ago














        @DirtyBit: Sorry, I really don't understand the question. '%g' % 0.9 is '0.9' and '%g' % 2.0 is '2'. Floats are displayed as ints only if they're really close to an int, e.g. 0.9999995. But not 0.9 or 0.99

        – Eric Duminil
        2 days ago





        @DirtyBit: Sorry, I really don't understand the question. '%g' % 0.9 is '0.9' and '%g' % 2.0 is '2'. Floats are displayed as ints only if they're really close to an int, e.g. 0.9999995. But not 0.9 or 0.99

        – Eric Duminil
        2 days ago













        exactly: print('%g' % 0.9999999999) # 1 but let's say the req. was to only have 1 if it was 1.0 and not 0.9999999999?

        – DirtyBit
        2 days ago






        exactly: print('%g' % 0.9999999999) # 1 but let's say the req. was to only have 1 if it was 1.0 and not 0.9999999999?

        – DirtyBit
        2 days ago





        2




        2





        @DirtyBit: You can specify the desired accuracy : '%.15g' % 0.999999999999999 is '0.999999999999999' and '%.2g' % 0.999is '1'. From this article : Rounding error is the characteristic feature of floating-point computation.

        – Eric Duminil
        2 days ago





        @DirtyBit: You can specify the desired accuracy : '%.15g' % 0.999999999999999 is '0.999999999999999' and '%.2g' % 0.999is '1'. From this article : Rounding error is the characteristic feature of floating-point computation.

        – Eric Duminil
        2 days ago




        1




        1





        Best answer since this is the only valid use case for what the OP wants anyway.

        – jpmc26
        15 hours ago





        Best answer since this is the only valid use case for what the OP wants anyway.

        – jpmc26
        15 hours ago











        10














        float.is_integer is a method on floats that returns whether or not the float represents an integer.



        You can just use this function I made called to_int, that uses is_integer to check whether it represents an integer (e.g. 1.0) or not (e.g. 1.5).



        If it represents an integer, return int(a), otherwise just return it's original value.



        As you see, I am not using elif or else because return exits the function:



        def to_int(a):
        if a.is_integer():
        return int(a)
        return a

        print(to_int(1.5))
        print(to_int(1.0))


        Output:



        1.5
        1





        share|improve this answer





























          10














          float.is_integer is a method on floats that returns whether or not the float represents an integer.



          You can just use this function I made called to_int, that uses is_integer to check whether it represents an integer (e.g. 1.0) or not (e.g. 1.5).



          If it represents an integer, return int(a), otherwise just return it's original value.



          As you see, I am not using elif or else because return exits the function:



          def to_int(a):
          if a.is_integer():
          return int(a)
          return a

          print(to_int(1.5))
          print(to_int(1.0))


          Output:



          1.5
          1





          share|improve this answer



























            10












            10








            10







            float.is_integer is a method on floats that returns whether or not the float represents an integer.



            You can just use this function I made called to_int, that uses is_integer to check whether it represents an integer (e.g. 1.0) or not (e.g. 1.5).



            If it represents an integer, return int(a), otherwise just return it's original value.



            As you see, I am not using elif or else because return exits the function:



            def to_int(a):
            if a.is_integer():
            return int(a)
            return a

            print(to_int(1.5))
            print(to_int(1.0))


            Output:



            1.5
            1





            share|improve this answer















            float.is_integer is a method on floats that returns whether or not the float represents an integer.



            You can just use this function I made called to_int, that uses is_integer to check whether it represents an integer (e.g. 1.0) or not (e.g. 1.5).



            If it represents an integer, return int(a), otherwise just return it's original value.



            As you see, I am not using elif or else because return exits the function:



            def to_int(a):
            if a.is_integer():
            return int(a)
            return a

            print(to_int(1.5))
            print(to_int(1.0))


            Output:



            1.5
            1






            share|improve this answer














            share|improve this answer



            share|improve this answer








            edited 20 hours ago

























            answered Apr 4 at 7:49









            U9-ForwardU9-Forward

            18k51744




            18k51744





















                5














                Python floats are approximations, so something that prints as 1.0 is not necessarily exactly 1.0. If you want to see if something is approximately an integer, use a sufficiently small epsilon value.



                EPSILON = 0.0001 # Make this smaller or larger depending on desired accuracy

                def func(x):
                if abs(x - round(x)) < EPSILON:
                return round(x)
                else:
                return x


                In general, if you're checking whether a float is == to something, that tends to be a code smell, as floating point values are inherently approximate. It's more appropriate in general to check whether a float is near something, within some epsilon range.






                share|improve this answer




















                • 3





                  While most floating point values are approximations, there are many integers that can be represented exactly. A 64-bit IEEE 754 floating point number (as used in Python and other languages) can represent exactly any signed integer that fits in 53 bits or less. Such integers can be converted 1 to 1 between a 64-bit float and 64-bit integer assuming the integer value could be represented with as little as 53 bits. Addition, subtraction, and multiplication that stays within 53-bits of integer space should yield identical results per IEEE 754 spec.

                  – penguin359
                  Apr 4 at 18:04






                • 1





                  @penguin359 While I agree that integers can be represented exactly in floating point, if you're in the situation that OP is in, you need to ask yourself how close to an integer is "close enough" for your purpose. Is 1.0 + 1e-16 "close enough"? Is 1.0 + 2e-16? It's an important question, as IEEE 754-based "is integer" methods will treat them differently, and you may or may not want to consider 1.0 + 2e-16 "not an integer" while saying 1.0 + 1e-16 is one. -- Having an explicit epsilon (versus the implicit one from IEEE 754) makes your desires clearer.

                  – R.M.
                  Apr 4 at 19:30











                • A comment seeming best at this answer: Setting an epsilon works as in the example provided works fine. Alternatively, especially if dealing with cents (currencies in general), I found it more useful to change from Python's default of binary representation to decimal one, as provided by module decimal (docs.python.org/3.7/library/decimal.html). The difference, for example in a loop iterating from -1 to +1 in increments of 0.1 is either passing very close to 0, or right at 0.0 -- without need for an epsilon set (how would you deal with -1.3877787807814457e-16 currency units?).

                  – Buttonwood
                  Apr 4 at 19:39






                • 1





                  "so something that prints as 1.0 is not necessarily exactly 1.0" That depends on the version of python. In modern python3 (IIRC since python 3.2) a float that prints as 1.0 is exactly 1.0. In older versions of python it may not be. Try "print (float(numpy.nextafter(1.0,2)))" to see what happens on your version.

                  – plugwash
                  2 days ago















                5














                Python floats are approximations, so something that prints as 1.0 is not necessarily exactly 1.0. If you want to see if something is approximately an integer, use a sufficiently small epsilon value.



                EPSILON = 0.0001 # Make this smaller or larger depending on desired accuracy

                def func(x):
                if abs(x - round(x)) < EPSILON:
                return round(x)
                else:
                return x


                In general, if you're checking whether a float is == to something, that tends to be a code smell, as floating point values are inherently approximate. It's more appropriate in general to check whether a float is near something, within some epsilon range.






                share|improve this answer




















                • 3





                  While most floating point values are approximations, there are many integers that can be represented exactly. A 64-bit IEEE 754 floating point number (as used in Python and other languages) can represent exactly any signed integer that fits in 53 bits or less. Such integers can be converted 1 to 1 between a 64-bit float and 64-bit integer assuming the integer value could be represented with as little as 53 bits. Addition, subtraction, and multiplication that stays within 53-bits of integer space should yield identical results per IEEE 754 spec.

                  – penguin359
                  Apr 4 at 18:04






                • 1





                  @penguin359 While I agree that integers can be represented exactly in floating point, if you're in the situation that OP is in, you need to ask yourself how close to an integer is "close enough" for your purpose. Is 1.0 + 1e-16 "close enough"? Is 1.0 + 2e-16? It's an important question, as IEEE 754-based "is integer" methods will treat them differently, and you may or may not want to consider 1.0 + 2e-16 "not an integer" while saying 1.0 + 1e-16 is one. -- Having an explicit epsilon (versus the implicit one from IEEE 754) makes your desires clearer.

                  – R.M.
                  Apr 4 at 19:30











                • A comment seeming best at this answer: Setting an epsilon works as in the example provided works fine. Alternatively, especially if dealing with cents (currencies in general), I found it more useful to change from Python's default of binary representation to decimal one, as provided by module decimal (docs.python.org/3.7/library/decimal.html). The difference, for example in a loop iterating from -1 to +1 in increments of 0.1 is either passing very close to 0, or right at 0.0 -- without need for an epsilon set (how would you deal with -1.3877787807814457e-16 currency units?).

                  – Buttonwood
                  Apr 4 at 19:39






                • 1





                  "so something that prints as 1.0 is not necessarily exactly 1.0" That depends on the version of python. In modern python3 (IIRC since python 3.2) a float that prints as 1.0 is exactly 1.0. In older versions of python it may not be. Try "print (float(numpy.nextafter(1.0,2)))" to see what happens on your version.

                  – plugwash
                  2 days ago













                5












                5








                5







                Python floats are approximations, so something that prints as 1.0 is not necessarily exactly 1.0. If you want to see if something is approximately an integer, use a sufficiently small epsilon value.



                EPSILON = 0.0001 # Make this smaller or larger depending on desired accuracy

                def func(x):
                if abs(x - round(x)) < EPSILON:
                return round(x)
                else:
                return x


                In general, if you're checking whether a float is == to something, that tends to be a code smell, as floating point values are inherently approximate. It's more appropriate in general to check whether a float is near something, within some epsilon range.






                share|improve this answer















                Python floats are approximations, so something that prints as 1.0 is not necessarily exactly 1.0. If you want to see if something is approximately an integer, use a sufficiently small epsilon value.



                EPSILON = 0.0001 # Make this smaller or larger depending on desired accuracy

                def func(x):
                if abs(x - round(x)) < EPSILON:
                return round(x)
                else:
                return x


                In general, if you're checking whether a float is == to something, that tends to be a code smell, as floating point values are inherently approximate. It's more appropriate in general to check whether a float is near something, within some epsilon range.







                share|improve this answer














                share|improve this answer



                share|improve this answer








                edited Apr 4 at 13:36

























                answered Apr 4 at 13:33









                Silvio MayoloSilvio Mayolo

                14.8k22554




                14.8k22554







                • 3





                  While most floating point values are approximations, there are many integers that can be represented exactly. A 64-bit IEEE 754 floating point number (as used in Python and other languages) can represent exactly any signed integer that fits in 53 bits or less. Such integers can be converted 1 to 1 between a 64-bit float and 64-bit integer assuming the integer value could be represented with as little as 53 bits. Addition, subtraction, and multiplication that stays within 53-bits of integer space should yield identical results per IEEE 754 spec.

                  – penguin359
                  Apr 4 at 18:04






                • 1





                  @penguin359 While I agree that integers can be represented exactly in floating point, if you're in the situation that OP is in, you need to ask yourself how close to an integer is "close enough" for your purpose. Is 1.0 + 1e-16 "close enough"? Is 1.0 + 2e-16? It's an important question, as IEEE 754-based "is integer" methods will treat them differently, and you may or may not want to consider 1.0 + 2e-16 "not an integer" while saying 1.0 + 1e-16 is one. -- Having an explicit epsilon (versus the implicit one from IEEE 754) makes your desires clearer.

                  – R.M.
                  Apr 4 at 19:30











                • A comment seeming best at this answer: Setting an epsilon works as in the example provided works fine. Alternatively, especially if dealing with cents (currencies in general), I found it more useful to change from Python's default of binary representation to decimal one, as provided by module decimal (docs.python.org/3.7/library/decimal.html). The difference, for example in a loop iterating from -1 to +1 in increments of 0.1 is either passing very close to 0, or right at 0.0 -- without need for an epsilon set (how would you deal with -1.3877787807814457e-16 currency units?).

                  – Buttonwood
                  Apr 4 at 19:39






                • 1





                  "so something that prints as 1.0 is not necessarily exactly 1.0" That depends on the version of python. In modern python3 (IIRC since python 3.2) a float that prints as 1.0 is exactly 1.0. In older versions of python it may not be. Try "print (float(numpy.nextafter(1.0,2)))" to see what happens on your version.

                  – plugwash
                  2 days ago












                • 3





                  While most floating point values are approximations, there are many integers that can be represented exactly. A 64-bit IEEE 754 floating point number (as used in Python and other languages) can represent exactly any signed integer that fits in 53 bits or less. Such integers can be converted 1 to 1 between a 64-bit float and 64-bit integer assuming the integer value could be represented with as little as 53 bits. Addition, subtraction, and multiplication that stays within 53-bits of integer space should yield identical results per IEEE 754 spec.

                  – penguin359
                  Apr 4 at 18:04






                • 1





                  @penguin359 While I agree that integers can be represented exactly in floating point, if you're in the situation that OP is in, you need to ask yourself how close to an integer is "close enough" for your purpose. Is 1.0 + 1e-16 "close enough"? Is 1.0 + 2e-16? It's an important question, as IEEE 754-based "is integer" methods will treat them differently, and you may or may not want to consider 1.0 + 2e-16 "not an integer" while saying 1.0 + 1e-16 is one. -- Having an explicit epsilon (versus the implicit one from IEEE 754) makes your desires clearer.

                  – R.M.
                  Apr 4 at 19:30











                • A comment seeming best at this answer: Setting an epsilon works as in the example provided works fine. Alternatively, especially if dealing with cents (currencies in general), I found it more useful to change from Python's default of binary representation to decimal one, as provided by module decimal (docs.python.org/3.7/library/decimal.html). The difference, for example in a loop iterating from -1 to +1 in increments of 0.1 is either passing very close to 0, or right at 0.0 -- without need for an epsilon set (how would you deal with -1.3877787807814457e-16 currency units?).

                  – Buttonwood
                  Apr 4 at 19:39






                • 1





                  "so something that prints as 1.0 is not necessarily exactly 1.0" That depends on the version of python. In modern python3 (IIRC since python 3.2) a float that prints as 1.0 is exactly 1.0. In older versions of python it may not be. Try "print (float(numpy.nextafter(1.0,2)))" to see what happens on your version.

                  – plugwash
                  2 days ago







                3




                3





                While most floating point values are approximations, there are many integers that can be represented exactly. A 64-bit IEEE 754 floating point number (as used in Python and other languages) can represent exactly any signed integer that fits in 53 bits or less. Such integers can be converted 1 to 1 between a 64-bit float and 64-bit integer assuming the integer value could be represented with as little as 53 bits. Addition, subtraction, and multiplication that stays within 53-bits of integer space should yield identical results per IEEE 754 spec.

                – penguin359
                Apr 4 at 18:04





                While most floating point values are approximations, there are many integers that can be represented exactly. A 64-bit IEEE 754 floating point number (as used in Python and other languages) can represent exactly any signed integer that fits in 53 bits or less. Such integers can be converted 1 to 1 between a 64-bit float and 64-bit integer assuming the integer value could be represented with as little as 53 bits. Addition, subtraction, and multiplication that stays within 53-bits of integer space should yield identical results per IEEE 754 spec.

                – penguin359
                Apr 4 at 18:04




                1




                1





                @penguin359 While I agree that integers can be represented exactly in floating point, if you're in the situation that OP is in, you need to ask yourself how close to an integer is "close enough" for your purpose. Is 1.0 + 1e-16 "close enough"? Is 1.0 + 2e-16? It's an important question, as IEEE 754-based "is integer" methods will treat them differently, and you may or may not want to consider 1.0 + 2e-16 "not an integer" while saying 1.0 + 1e-16 is one. -- Having an explicit epsilon (versus the implicit one from IEEE 754) makes your desires clearer.

                – R.M.
                Apr 4 at 19:30





                @penguin359 While I agree that integers can be represented exactly in floating point, if you're in the situation that OP is in, you need to ask yourself how close to an integer is "close enough" for your purpose. Is 1.0 + 1e-16 "close enough"? Is 1.0 + 2e-16? It's an important question, as IEEE 754-based "is integer" methods will treat them differently, and you may or may not want to consider 1.0 + 2e-16 "not an integer" while saying 1.0 + 1e-16 is one. -- Having an explicit epsilon (versus the implicit one from IEEE 754) makes your desires clearer.

                – R.M.
                Apr 4 at 19:30













                A comment seeming best at this answer: Setting an epsilon works as in the example provided works fine. Alternatively, especially if dealing with cents (currencies in general), I found it more useful to change from Python's default of binary representation to decimal one, as provided by module decimal (docs.python.org/3.7/library/decimal.html). The difference, for example in a loop iterating from -1 to +1 in increments of 0.1 is either passing very close to 0, or right at 0.0 -- without need for an epsilon set (how would you deal with -1.3877787807814457e-16 currency units?).

                – Buttonwood
                Apr 4 at 19:39





                A comment seeming best at this answer: Setting an epsilon works as in the example provided works fine. Alternatively, especially if dealing with cents (currencies in general), I found it more useful to change from Python's default of binary representation to decimal one, as provided by module decimal (docs.python.org/3.7/library/decimal.html). The difference, for example in a loop iterating from -1 to +1 in increments of 0.1 is either passing very close to 0, or right at 0.0 -- without need for an epsilon set (how would you deal with -1.3877787807814457e-16 currency units?).

                – Buttonwood
                Apr 4 at 19:39




                1




                1





                "so something that prints as 1.0 is not necessarily exactly 1.0" That depends on the version of python. In modern python3 (IIRC since python 3.2) a float that prints as 1.0 is exactly 1.0. In older versions of python it may not be. Try "print (float(numpy.nextafter(1.0,2)))" to see what happens on your version.

                – plugwash
                2 days ago





                "so something that prints as 1.0 is not necessarily exactly 1.0" That depends on the version of python. In modern python3 (IIRC since python 3.2) a float that prints as 1.0 is exactly 1.0. In older versions of python it may not be. Try "print (float(numpy.nextafter(1.0,2)))" to see what happens on your version.

                – plugwash
                2 days ago











                1














                What I used to do in the past in C++ is, lets say you have these variables:



                float x = 1.5;
                float y = 1.0;


                Then you could do something like this:



                if(x == (int)x) 
                return 1;
                else return 0;


                This will return 0 because 1.5 is not equal to 1



                if(y == (int)y) 
                return 1;
                else return 0;


                This will return 1 because 1.0 is equal to 1



                Of course your question is about Python and the function is_integer() should work great, I just thought some people might find this useful.






                share|improve this answer








                New contributor




                Stefan Kostoski is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                Check out our Code of Conduct.















                • 1





                  The question was to convert a float to int whenever the float in question has an integer value. AFAIK this is not possible in C++, because you cannot return different values from a function.

                  – M.Herzkamp
                  Apr 4 at 11:49






                • 3





                  @M.Herzkamp you could have a union though.

                  – Baldrickk
                  Apr 4 at 12:13











                • And also you could set another integer variable and save the float there if the condition above is met

                  – Stefan Kostoski
                  Apr 4 at 12:40











                • The digression on C++ isn't really relevant. You can do the same thing in Python: foo = lambda x: int(x) if int(x) == x else x. (Or in Python 3.8, to avoid the duplicate call to int, lambda x: y if (y:=int(x)) == x else x.

                  – chepner
                  Apr 4 at 13:11











                • @chepner I tried foo = lambda x: int(x) if int(x) == x else x the very moment I wrote the answer above, for some reason it did not work for me in 3.6. Any clue?

                  – DirtyBit
                  Apr 4 at 13:18















                1














                What I used to do in the past in C++ is, lets say you have these variables:



                float x = 1.5;
                float y = 1.0;


                Then you could do something like this:



                if(x == (int)x) 
                return 1;
                else return 0;


                This will return 0 because 1.5 is not equal to 1



                if(y == (int)y) 
                return 1;
                else return 0;


                This will return 1 because 1.0 is equal to 1



                Of course your question is about Python and the function is_integer() should work great, I just thought some people might find this useful.






                share|improve this answer








                New contributor




                Stefan Kostoski is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                Check out our Code of Conduct.















                • 1





                  The question was to convert a float to int whenever the float in question has an integer value. AFAIK this is not possible in C++, because you cannot return different values from a function.

                  – M.Herzkamp
                  Apr 4 at 11:49






                • 3





                  @M.Herzkamp you could have a union though.

                  – Baldrickk
                  Apr 4 at 12:13











                • And also you could set another integer variable and save the float there if the condition above is met

                  – Stefan Kostoski
                  Apr 4 at 12:40











                • The digression on C++ isn't really relevant. You can do the same thing in Python: foo = lambda x: int(x) if int(x) == x else x. (Or in Python 3.8, to avoid the duplicate call to int, lambda x: y if (y:=int(x)) == x else x.

                  – chepner
                  Apr 4 at 13:11











                • @chepner I tried foo = lambda x: int(x) if int(x) == x else x the very moment I wrote the answer above, for some reason it did not work for me in 3.6. Any clue?

                  – DirtyBit
                  Apr 4 at 13:18













                1












                1








                1







                What I used to do in the past in C++ is, lets say you have these variables:



                float x = 1.5;
                float y = 1.0;


                Then you could do something like this:



                if(x == (int)x) 
                return 1;
                else return 0;


                This will return 0 because 1.5 is not equal to 1



                if(y == (int)y) 
                return 1;
                else return 0;


                This will return 1 because 1.0 is equal to 1



                Of course your question is about Python and the function is_integer() should work great, I just thought some people might find this useful.






                share|improve this answer








                New contributor




                Stefan Kostoski is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                Check out our Code of Conduct.










                What I used to do in the past in C++ is, lets say you have these variables:



                float x = 1.5;
                float y = 1.0;


                Then you could do something like this:



                if(x == (int)x) 
                return 1;
                else return 0;


                This will return 0 because 1.5 is not equal to 1



                if(y == (int)y) 
                return 1;
                else return 0;


                This will return 1 because 1.0 is equal to 1



                Of course your question is about Python and the function is_integer() should work great, I just thought some people might find this useful.







                share|improve this answer








                New contributor




                Stefan Kostoski is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                Check out our Code of Conduct.









                share|improve this answer



                share|improve this answer






                New contributor




                Stefan Kostoski is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                Check out our Code of Conduct.









                answered Apr 4 at 10:33









                Stefan KostoskiStefan Kostoski

                111




                111




                New contributor




                Stefan Kostoski is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                Check out our Code of Conduct.





                New contributor





                Stefan Kostoski is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                Check out our Code of Conduct.






                Stefan Kostoski is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                Check out our Code of Conduct.







                • 1





                  The question was to convert a float to int whenever the float in question has an integer value. AFAIK this is not possible in C++, because you cannot return different values from a function.

                  – M.Herzkamp
                  Apr 4 at 11:49






                • 3





                  @M.Herzkamp you could have a union though.

                  – Baldrickk
                  Apr 4 at 12:13











                • And also you could set another integer variable and save the float there if the condition above is met

                  – Stefan Kostoski
                  Apr 4 at 12:40











                • The digression on C++ isn't really relevant. You can do the same thing in Python: foo = lambda x: int(x) if int(x) == x else x. (Or in Python 3.8, to avoid the duplicate call to int, lambda x: y if (y:=int(x)) == x else x.

                  – chepner
                  Apr 4 at 13:11











                • @chepner I tried foo = lambda x: int(x) if int(x) == x else x the very moment I wrote the answer above, for some reason it did not work for me in 3.6. Any clue?

                  – DirtyBit
                  Apr 4 at 13:18












                • 1





                  The question was to convert a float to int whenever the float in question has an integer value. AFAIK this is not possible in C++, because you cannot return different values from a function.

                  – M.Herzkamp
                  Apr 4 at 11:49






                • 3





                  @M.Herzkamp you could have a union though.

                  – Baldrickk
                  Apr 4 at 12:13











                • And also you could set another integer variable and save the float there if the condition above is met

                  – Stefan Kostoski
                  Apr 4 at 12:40











                • The digression on C++ isn't really relevant. You can do the same thing in Python: foo = lambda x: int(x) if int(x) == x else x. (Or in Python 3.8, to avoid the duplicate call to int, lambda x: y if (y:=int(x)) == x else x.

                  – chepner
                  Apr 4 at 13:11











                • @chepner I tried foo = lambda x: int(x) if int(x) == x else x the very moment I wrote the answer above, for some reason it did not work for me in 3.6. Any clue?

                  – DirtyBit
                  Apr 4 at 13:18







                1




                1





                The question was to convert a float to int whenever the float in question has an integer value. AFAIK this is not possible in C++, because you cannot return different values from a function.

                – M.Herzkamp
                Apr 4 at 11:49





                The question was to convert a float to int whenever the float in question has an integer value. AFAIK this is not possible in C++, because you cannot return different values from a function.

                – M.Herzkamp
                Apr 4 at 11:49




                3




                3





                @M.Herzkamp you could have a union though.

                – Baldrickk
                Apr 4 at 12:13





                @M.Herzkamp you could have a union though.

                – Baldrickk
                Apr 4 at 12:13













                And also you could set another integer variable and save the float there if the condition above is met

                – Stefan Kostoski
                Apr 4 at 12:40





                And also you could set another integer variable and save the float there if the condition above is met

                – Stefan Kostoski
                Apr 4 at 12:40













                The digression on C++ isn't really relevant. You can do the same thing in Python: foo = lambda x: int(x) if int(x) == x else x. (Or in Python 3.8, to avoid the duplicate call to int, lambda x: y if (y:=int(x)) == x else x.

                – chepner
                Apr 4 at 13:11





                The digression on C++ isn't really relevant. You can do the same thing in Python: foo = lambda x: int(x) if int(x) == x else x. (Or in Python 3.8, to avoid the duplicate call to int, lambda x: y if (y:=int(x)) == x else x.

                – chepner
                Apr 4 at 13:11













                @chepner I tried foo = lambda x: int(x) if int(x) == x else x the very moment I wrote the answer above, for some reason it did not work for me in 3.6. Any clue?

                – DirtyBit
                Apr 4 at 13:18





                @chepner I tried foo = lambda x: int(x) if int(x) == x else x the very moment I wrote the answer above, for some reason it did not work for me in 3.6. Any clue?

                – DirtyBit
                Apr 4 at 13:18











                0














                A safe approach using lambda and is_integer():



                >>> to_int = lambda x: int(x) if float(x).is_integer() else x
                >>> to_int(1)
                1
                >>> to_int(1.0)
                1
                >>> to_int(1.2)
                1.2
                >>>





                share|improve this answer


















                • 1





                  Why do you use a lambda instead of a function? Especially since you name your lambda?

                  – Eric Duminil
                  2 days ago











                • There is no special reason. I guess it just makes it easier to use everywhere else.

                  – accdias
                  2 days ago






                • 2





                  Okay. I meant to say that you could use def to_int(x): return int(x) if float(x).is_integer() else x instead. A lambda is an anonymous function. So a named lambda is just a function.

                  – Eric Duminil
                  2 days ago











                • @EricDumini, I see your point.

                  – accdias
                  2 days ago















                0














                A safe approach using lambda and is_integer():



                >>> to_int = lambda x: int(x) if float(x).is_integer() else x
                >>> to_int(1)
                1
                >>> to_int(1.0)
                1
                >>> to_int(1.2)
                1.2
                >>>





                share|improve this answer


















                • 1





                  Why do you use a lambda instead of a function? Especially since you name your lambda?

                  – Eric Duminil
                  2 days ago











                • There is no special reason. I guess it just makes it easier to use everywhere else.

                  – accdias
                  2 days ago






                • 2





                  Okay. I meant to say that you could use def to_int(x): return int(x) if float(x).is_integer() else x instead. A lambda is an anonymous function. So a named lambda is just a function.

                  – Eric Duminil
                  2 days ago











                • @EricDumini, I see your point.

                  – accdias
                  2 days ago













                0












                0








                0







                A safe approach using lambda and is_integer():



                >>> to_int = lambda x: int(x) if float(x).is_integer() else x
                >>> to_int(1)
                1
                >>> to_int(1.0)
                1
                >>> to_int(1.2)
                1.2
                >>>





                share|improve this answer













                A safe approach using lambda and is_integer():



                >>> to_int = lambda x: int(x) if float(x).is_integer() else x
                >>> to_int(1)
                1
                >>> to_int(1.0)
                1
                >>> to_int(1.2)
                1.2
                >>>






                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered 2 days ago









                accdiasaccdias

                660612




                660612







                • 1





                  Why do you use a lambda instead of a function? Especially since you name your lambda?

                  – Eric Duminil
                  2 days ago











                • There is no special reason. I guess it just makes it easier to use everywhere else.

                  – accdias
                  2 days ago






                • 2





                  Okay. I meant to say that you could use def to_int(x): return int(x) if float(x).is_integer() else x instead. A lambda is an anonymous function. So a named lambda is just a function.

                  – Eric Duminil
                  2 days ago











                • @EricDumini, I see your point.

                  – accdias
                  2 days ago












                • 1





                  Why do you use a lambda instead of a function? Especially since you name your lambda?

                  – Eric Duminil
                  2 days ago











                • There is no special reason. I guess it just makes it easier to use everywhere else.

                  – accdias
                  2 days ago






                • 2





                  Okay. I meant to say that you could use def to_int(x): return int(x) if float(x).is_integer() else x instead. A lambda is an anonymous function. So a named lambda is just a function.

                  – Eric Duminil
                  2 days ago











                • @EricDumini, I see your point.

                  – accdias
                  2 days ago







                1




                1





                Why do you use a lambda instead of a function? Especially since you name your lambda?

                – Eric Duminil
                2 days ago





                Why do you use a lambda instead of a function? Especially since you name your lambda?

                – Eric Duminil
                2 days ago













                There is no special reason. I guess it just makes it easier to use everywhere else.

                – accdias
                2 days ago





                There is no special reason. I guess it just makes it easier to use everywhere else.

                – accdias
                2 days ago




                2




                2





                Okay. I meant to say that you could use def to_int(x): return int(x) if float(x).is_integer() else x instead. A lambda is an anonymous function. So a named lambda is just a function.

                – Eric Duminil
                2 days ago





                Okay. I meant to say that you could use def to_int(x): return int(x) if float(x).is_integer() else x instead. A lambda is an anonymous function. So a named lambda is just a function.

                – Eric Duminil
                2 days ago













                @EricDumini, I see your point.

                – accdias
                2 days ago





                @EricDumini, I see your point.

                – accdias
                2 days ago











                0














                for list of numbers:



                def get_int_if_possible(list_of_numbers):
                return [int(x) if x == int(x) else x for x in list_of_numbers]


                for one number:



                def get_int_if_possible(number):
                return int(number) if number == int(number) else number





                share|improve this answer



























                  0














                  for list of numbers:



                  def get_int_if_possible(list_of_numbers):
                  return [int(x) if x == int(x) else x for x in list_of_numbers]


                  for one number:



                  def get_int_if_possible(number):
                  return int(number) if number == int(number) else number





                  share|improve this answer

























                    0












                    0








                    0







                    for list of numbers:



                    def get_int_if_possible(list_of_numbers):
                    return [int(x) if x == int(x) else x for x in list_of_numbers]


                    for one number:



                    def get_int_if_possible(number):
                    return int(number) if number == int(number) else number





                    share|improve this answer













                    for list of numbers:



                    def get_int_if_possible(list_of_numbers):
                    return [int(x) if x == int(x) else x for x in list_of_numbers]


                    for one number:



                    def get_int_if_possible(number):
                    return int(number) if number == int(number) else number






                    share|improve this answer












                    share|improve this answer



                    share|improve this answer










                    answered 15 hours ago









                    Baruch G.Baruch G.

                    337




                    337





















                        -1














                        use .strip('.0') could get wrong if your variable is 0.999999



                        >>> data = [1.0, 1, 1.5, 0.9999999999]
                        >>> data = [str(x) for x in data]
                        >>>
                        >>> def func(s):
                        ... s = [x.strip('.0') for x in s]
                        ... return [float(x) if x == x.strip('.0') else x for x in s]
                        ...
                        >>> print(func(data))
                        [1.0, 1.0, 1.5, 9999999999.0]





                        share|improve this answer








                        New contributor




                        Spinel is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                        Check out our Code of Conduct.
























                          -1














                          use .strip('.0') could get wrong if your variable is 0.999999



                          >>> data = [1.0, 1, 1.5, 0.9999999999]
                          >>> data = [str(x) for x in data]
                          >>>
                          >>> def func(s):
                          ... s = [x.strip('.0') for x in s]
                          ... return [float(x) if x == x.strip('.0') else x for x in s]
                          ...
                          >>> print(func(data))
                          [1.0, 1.0, 1.5, 9999999999.0]





                          share|improve this answer








                          New contributor




                          Spinel is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                          Check out our Code of Conduct.






















                            -1












                            -1








                            -1







                            use .strip('.0') could get wrong if your variable is 0.999999



                            >>> data = [1.0, 1, 1.5, 0.9999999999]
                            >>> data = [str(x) for x in data]
                            >>>
                            >>> def func(s):
                            ... s = [x.strip('.0') for x in s]
                            ... return [float(x) if x == x.strip('.0') else x for x in s]
                            ...
                            >>> print(func(data))
                            [1.0, 1.0, 1.5, 9999999999.0]





                            share|improve this answer








                            New contributor




                            Spinel is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                            Check out our Code of Conduct.










                            use .strip('.0') could get wrong if your variable is 0.999999



                            >>> data = [1.0, 1, 1.5, 0.9999999999]
                            >>> data = [str(x) for x in data]
                            >>>
                            >>> def func(s):
                            ... s = [x.strip('.0') for x in s]
                            ... return [float(x) if x == x.strip('.0') else x for x in s]
                            ...
                            >>> print(func(data))
                            [1.0, 1.0, 1.5, 9999999999.0]






                            share|improve this answer








                            New contributor




                            Spinel is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                            Check out our Code of Conduct.









                            share|improve this answer



                            share|improve this answer






                            New contributor




                            Spinel is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                            Check out our Code of Conduct.









                            answered 17 hours ago









                            SpinelSpinel

                            11




                            11




                            New contributor




                            Spinel is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                            Check out our Code of Conduct.





                            New contributor





                            Spinel is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                            Check out our Code of Conduct.






                            Spinel is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                            Check out our Code of Conduct.





















                                -2














                                A simple thing you could do is use the modulo operator:



                                if (myFloat % 1 == 0) // Number is an int
                                else // numer is not an int


                                (Note: Not real code (although compilable with some languages)!)



                                EDIT:
                                Thanks to "popular demand" here's some Python code (untested):



                                if myFloat % 1 = 0:
                                # Is an integer
                                return int(myFloat)
                                else:
                                # Is not an integer
                                return myFloat


                                Again, the code is untested, but I think it should work (not too familiar w/ Python, tbh)






                                share|improve this answer




















                                • 2





                                  I'm sorry but that is not a valid Python structure, would you please have it a valid Python format or allow me to edit it for you?

                                  – DirtyBit
                                  Apr 4 at 11:21






                                • 2





                                  As he mentioned, this is simply a logic. Not a working code. This should be fine IMO.

                                  – Amit Joshi
                                  Apr 4 at 12:49






                                • 4





                                  And readers should also google why it isn't possible to use return outside of a function, or what the difference between == and = is?

                                  – Eric Duminil
                                  Apr 4 at 13:32






                                • 8





                                  To avoid downvotes, you should either try to answer questions for languages you're familiar with or at the very least try to run your code before posting.

                                  – Eric Duminil
                                  Apr 4 at 13:44






                                • 2





                                  @SimonC: Python syntax is close enough to pseudo-code that it doesn't really make sense to write pseudo-code for Python IMHO. Feel free to edit your answer with a correct Python syntax and I'd be happy to revert my downvote.

                                  – Eric Duminil
                                  2 days ago















                                -2














                                A simple thing you could do is use the modulo operator:



                                if (myFloat % 1 == 0) // Number is an int
                                else // numer is not an int


                                (Note: Not real code (although compilable with some languages)!)



                                EDIT:
                                Thanks to "popular demand" here's some Python code (untested):



                                if myFloat % 1 = 0:
                                # Is an integer
                                return int(myFloat)
                                else:
                                # Is not an integer
                                return myFloat


                                Again, the code is untested, but I think it should work (not too familiar w/ Python, tbh)






                                share|improve this answer




















                                • 2





                                  I'm sorry but that is not a valid Python structure, would you please have it a valid Python format or allow me to edit it for you?

                                  – DirtyBit
                                  Apr 4 at 11:21






                                • 2





                                  As he mentioned, this is simply a logic. Not a working code. This should be fine IMO.

                                  – Amit Joshi
                                  Apr 4 at 12:49






                                • 4





                                  And readers should also google why it isn't possible to use return outside of a function, or what the difference between == and = is?

                                  – Eric Duminil
                                  Apr 4 at 13:32






                                • 8





                                  To avoid downvotes, you should either try to answer questions for languages you're familiar with or at the very least try to run your code before posting.

                                  – Eric Duminil
                                  Apr 4 at 13:44






                                • 2





                                  @SimonC: Python syntax is close enough to pseudo-code that it doesn't really make sense to write pseudo-code for Python IMHO. Feel free to edit your answer with a correct Python syntax and I'd be happy to revert my downvote.

                                  – Eric Duminil
                                  2 days ago













                                -2












                                -2








                                -2







                                A simple thing you could do is use the modulo operator:



                                if (myFloat % 1 == 0) // Number is an int
                                else // numer is not an int


                                (Note: Not real code (although compilable with some languages)!)



                                EDIT:
                                Thanks to "popular demand" here's some Python code (untested):



                                if myFloat % 1 = 0:
                                # Is an integer
                                return int(myFloat)
                                else:
                                # Is not an integer
                                return myFloat


                                Again, the code is untested, but I think it should work (not too familiar w/ Python, tbh)






                                share|improve this answer















                                A simple thing you could do is use the modulo operator:



                                if (myFloat % 1 == 0) // Number is an int
                                else // numer is not an int


                                (Note: Not real code (although compilable with some languages)!)



                                EDIT:
                                Thanks to "popular demand" here's some Python code (untested):



                                if myFloat % 1 = 0:
                                # Is an integer
                                return int(myFloat)
                                else:
                                # Is not an integer
                                return myFloat


                                Again, the code is untested, but I think it should work (not too familiar w/ Python, tbh)







                                share|improve this answer














                                share|improve this answer



                                share|improve this answer








                                edited Apr 4 at 12:59

























                                answered Apr 4 at 11:11









                                SimonCSimonC

                                503624




                                503624







                                • 2





                                  I'm sorry but that is not a valid Python structure, would you please have it a valid Python format or allow me to edit it for you?

                                  – DirtyBit
                                  Apr 4 at 11:21






                                • 2





                                  As he mentioned, this is simply a logic. Not a working code. This should be fine IMO.

                                  – Amit Joshi
                                  Apr 4 at 12:49






                                • 4





                                  And readers should also google why it isn't possible to use return outside of a function, or what the difference between == and = is?

                                  – Eric Duminil
                                  Apr 4 at 13:32






                                • 8





                                  To avoid downvotes, you should either try to answer questions for languages you're familiar with or at the very least try to run your code before posting.

                                  – Eric Duminil
                                  Apr 4 at 13:44






                                • 2





                                  @SimonC: Python syntax is close enough to pseudo-code that it doesn't really make sense to write pseudo-code for Python IMHO. Feel free to edit your answer with a correct Python syntax and I'd be happy to revert my downvote.

                                  – Eric Duminil
                                  2 days ago












                                • 2





                                  I'm sorry but that is not a valid Python structure, would you please have it a valid Python format or allow me to edit it for you?

                                  – DirtyBit
                                  Apr 4 at 11:21






                                • 2





                                  As he mentioned, this is simply a logic. Not a working code. This should be fine IMO.

                                  – Amit Joshi
                                  Apr 4 at 12:49






                                • 4





                                  And readers should also google why it isn't possible to use return outside of a function, or what the difference between == and = is?

                                  – Eric Duminil
                                  Apr 4 at 13:32






                                • 8





                                  To avoid downvotes, you should either try to answer questions for languages you're familiar with or at the very least try to run your code before posting.

                                  – Eric Duminil
                                  Apr 4 at 13:44






                                • 2





                                  @SimonC: Python syntax is close enough to pseudo-code that it doesn't really make sense to write pseudo-code for Python IMHO. Feel free to edit your answer with a correct Python syntax and I'd be happy to revert my downvote.

                                  – Eric Duminil
                                  2 days ago







                                2




                                2





                                I'm sorry but that is not a valid Python structure, would you please have it a valid Python format or allow me to edit it for you?

                                – DirtyBit
                                Apr 4 at 11:21





                                I'm sorry but that is not a valid Python structure, would you please have it a valid Python format or allow me to edit it for you?

                                – DirtyBit
                                Apr 4 at 11:21




                                2




                                2





                                As he mentioned, this is simply a logic. Not a working code. This should be fine IMO.

                                – Amit Joshi
                                Apr 4 at 12:49





                                As he mentioned, this is simply a logic. Not a working code. This should be fine IMO.

                                – Amit Joshi
                                Apr 4 at 12:49




                                4




                                4





                                And readers should also google why it isn't possible to use return outside of a function, or what the difference between == and = is?

                                – Eric Duminil
                                Apr 4 at 13:32





                                And readers should also google why it isn't possible to use return outside of a function, or what the difference between == and = is?

                                – Eric Duminil
                                Apr 4 at 13:32




                                8




                                8





                                To avoid downvotes, you should either try to answer questions for languages you're familiar with or at the very least try to run your code before posting.

                                – Eric Duminil
                                Apr 4 at 13:44





                                To avoid downvotes, you should either try to answer questions for languages you're familiar with or at the very least try to run your code before posting.

                                – Eric Duminil
                                Apr 4 at 13:44




                                2




                                2





                                @SimonC: Python syntax is close enough to pseudo-code that it doesn't really make sense to write pseudo-code for Python IMHO. Feel free to edit your answer with a correct Python syntax and I'd be happy to revert my downvote.

                                – Eric Duminil
                                2 days ago





                                @SimonC: Python syntax is close enough to pseudo-code that it doesn't really make sense to write pseudo-code for Python IMHO. Feel free to edit your answer with a correct Python syntax and I'd be happy to revert my downvote.

                                – Eric Duminil
                                2 days ago










                                Raymond Shen is a new contributor. Be nice, and check out our Code of Conduct.









                                draft saved

                                draft discarded


















                                Raymond Shen is a new contributor. Be nice, and check out our Code of Conduct.












                                Raymond Shen is a new contributor. Be nice, and check out our Code of Conduct.











                                Raymond Shen is a new contributor. Be nice, and check out our Code of Conduct.














                                Thanks for contributing an answer to Stack Overflow!


                                • Please be sure to answer the question. Provide details and share your research!

                                But avoid


                                • Asking for help, clarification, or responding to other answers.

                                • Making statements based on opinion; back them up with references or personal experience.

                                To learn more, see our tips on writing great answers.




                                draft saved


                                draft discarded














                                StackExchange.ready(
                                function ()
                                StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55510485%2fpython-return-float-1-0-as-int-1-but-float-1-5-as-float-1-5%23new-answer', 'question_page');

                                );

                                Post as a guest















                                Required, but never shown





















































                                Required, but never shown














                                Required, but never shown












                                Required, but never shown







                                Required, but never shown

































                                Required, but never shown














                                Required, but never shown












                                Required, but never shown







                                Required, but never shown







                                Popular posts from this blog

                                Club Baloncesto Breogán Índice Historia | Pavillón | Nome | O Breogán na cultura popular | Xogadores | Adestradores | Presidentes | Palmarés | Historial | Líderes | Notas | Véxase tamén | Menú de navegacióncbbreogan.galCadroGuía oficial da ACB 2009-10, páxina 201Guía oficial ACB 1992, páxina 183. Editorial DB.É de 6.500 espectadores sentados axeitándose á última normativa"Estudiantes Junior, entre as mellores canteiras"o orixinalHemeroteca El Mundo Deportivo, 16 setembro de 1970, páxina 12Historia do BreogánAlfredo Pérez, o último canoneiroHistoria C.B. BreogánHemeroteca de El Mundo DeportivoJimmy Wright, norteamericano do Breogán deixará Lugo por ameazas de morteResultados de Breogán en 1986-87Resultados de Breogán en 1990-91Ficha de Velimir Perasović en acb.comResultados de Breogán en 1994-95Breogán arrasa al Barça. "El Mundo Deportivo", 27 de setembro de 1999, páxina 58CB Breogán - FC BarcelonaA FEB invita a participar nunha nova Liga EuropeaCharlie Bell na prensa estatalMáximos anotadores 2005Tempada 2005-06 : Tódolos Xogadores da Xornada""Non quero pensar nunha man negra, mais pregúntome que está a pasar""o orixinalRaúl López, orgulloso dos xogadores, presume da boa saúde económica do BreogánJulio González confirma que cesa como presidente del BreogánHomenaxe a Lisardo GómezA tempada do rexurdimento celesteEntrevista a Lisardo GómezEl COB dinamita el Pazo para forzar el quinto (69-73)Cafés Candelas, patrocinador del CB Breogán"Suso Lázare, novo presidente do Breogán"o orixinalCafés Candelas Breogán firma el mayor triunfo de la historiaEl Breogán realizará 17 homenajes por su cincuenta aniversario"O Breogán honra ao seu fundador e primeiro presidente"o orixinalMiguel Giao recibiu a homenaxe do PazoHomenaxe aos primeiros gladiadores celestesO home que nos amosa como ver o Breo co corazónTita Franco será homenaxeada polos #50anosdeBreoJulio Vila recibirá unha homenaxe in memoriam polos #50anosdeBreo"O Breogán homenaxeará aos seus aboados máis veteráns"Pechada ovación a «Capi» Sanmartín e Ricardo «Corazón de González»Homenaxe por décadas de informaciónPaco García volve ao Pazo con motivo do 50 aniversario"Resultados y clasificaciones""O Cafés Candelas Breogán, campión da Copa Princesa""O Cafés Candelas Breogán, equipo ACB"C.B. Breogán"Proxecto social"o orixinal"Centros asociados"o orixinalFicha en imdb.comMario Camus trata la recuperación del amor en 'La vieja música', su última película"Páxina web oficial""Club Baloncesto Breogán""C. B. Breogán S.A.D."eehttp://www.fegaba.com

                                Vilaño, A Laracha Índice Patrimonio | Lugares e parroquias | Véxase tamén | Menú de navegación43°14′52″N 8°36′03″O / 43.24775, -8.60070

                                Cegueira Índice Epidemioloxía | Deficiencia visual | Tipos de cegueira | Principais causas de cegueira | Tratamento | Técnicas de adaptación e axudas | Vida dos cegos | Primeiros auxilios | Crenzas respecto das persoas cegas | Crenzas das persoas cegas | O neno deficiente visual | Aspectos psicolóxicos da cegueira | Notas | Véxase tamén | Menú de navegación54.054.154.436928256blindnessDicionario da Real Academia GalegaPortal das Palabras"International Standards: Visual Standards — Aspects and Ranges of Vision Loss with Emphasis on Population Surveys.""Visual impairment and blindness""Presentan un plan para previr a cegueira"o orixinalACCDV Associació Catalana de Cecs i Disminuïts Visuals - PMFTrachoma"Effect of gene therapy on visual function in Leber's congenital amaurosis"1844137110.1056/NEJMoa0802268Cans guía - os mellores amigos dos cegosArquivadoEscola de cans guía para cegos en Mortágua, PortugalArquivado"Tecnología para ciegos y deficientes visuales. Recopilación de recursos gratuitos en la Red""Colorino""‘COL.diesis’, escuchar los sonidos del color""COL.diesis: Transforming Colour into Melody and Implementing the Result in a Colour Sensor Device"o orixinal"Sistema de desarrollo de sinestesia color-sonido para invidentes utilizando un protocolo de audio""Enseñanza táctil - geometría y color. Juegos didácticos para niños ciegos y videntes""Sistema Constanz"L'ocupació laboral dels cecs a l'Estat espanyol està pràcticament equiparada a la de les persones amb visió, entrevista amb Pedro ZuritaONCE (Organización Nacional de Cegos de España)Prevención da cegueiraDescrición de deficiencias visuais (Disc@pnet)Braillín, un boneco atractivo para calquera neno, con ou sen discapacidade, que permite familiarizarse co sistema de escritura e lectura brailleAxudas Técnicas36838ID00897494007150-90057129528256DOID:1432HP:0000618D001766C10.597.751.941.162C97109C0155020