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?

Can I interfere when another PC is about to be attacked?

Copycat chess is back

Do airline pilots ever risk not hearing communication directed to them specifically, from traffic controllers?

Concept of linear mappings are confusing me

A function which translates a sentence to title-case

Is there a minimum number of transactions in a block?

Email Account under attack (really) - anything I can do?

What Brexit solution does the DUP want?

Could a US political party gain complete control over the government by removing checks & balances?

Why has Russell's definition of numbers using equivalence classes been finally abandoned? ( If it has actually been abandoned).

Can Medicine checks be used, with decent rolls, to completely mitigate the risk of death from ongoing damage?

How old can references or sources in a thesis be?

I’m planning on buying a laser printer but concerned about the life cycle of toner in the machine

Shell script can be run only with sh command

How to make payment on the internet without leaving a money trail?

Is there really no realistic way for a skeleton monster to move around without magic?

How do I create uniquely male characters?

What do you call something that goes against the spirit of the law, but is legal when interpreting the law to the letter?

DOS, create pipe for stdin/stdout of command.com(or 4dos.com) in C or Batch?

Banach space and Hilbert space topology

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

I probably found a bug with the sudo apt install function

How do we improve the relationship with a client software team that performs poorly and is becoming less collaborative?

Chess with symmetric move-square



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
    Apr 5 at 2:33







  • 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
    18 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
          Apr 5 at 2:33







        • 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
          Apr 5 at 2:33







        • 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 19 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
          Apr 5 at 2:33







        • 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
          Apr 5 at 2:33







        • 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
        Apr 5 at 2:33






        @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
        Apr 5 at 2:33





        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
          18 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
          18 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
          18 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
          18 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
        18 hours ago





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

        – jpmc26
        18 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 22 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 Apr 5 at 2:43









                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 17 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 19 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

                                Tamil (spriik) Luke uk diar | Nawigatjuun

                                Align equal signs while including text over equalitiesAMS align: left aligned text/math plus multicolumn alignmentMultiple alignmentsAligning equations in multiple placesNumbering and aligning an equation with multiple columnsHow to align one equation with another multline equationUsing \ in environments inside the begintabularxNumber equations and preserving alignment of equal signsHow can I align equations to the left and to the right?Double equation alignment problem within align enviromentAligned within align: Why are they right-aligned?

                                Training a classifier when some of the features are unknownWhy does Gradient Boosting regression predict negative values when there are no negative y-values in my training set?How to improve an existing (trained) classifier?What is effect when I set up some self defined predisctor variables?Why Matlab neural network classification returns decimal values on prediction dataset?Fitting and transforming text data in training, testing, and validation setsHow to quantify the performance of the classifier (multi-class SVM) using the test data?How do I control for some patients providing multiple samples in my training data?Training and Test setTraining a convolutional neural network for image denoising in MatlabShouldn't an autoencoder with #(neurons in hidden layer) = #(neurons in input layer) be “perfect”?