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?
Why are 150k or 200k jobs considered good when there are 300k+ births a month?
DOS, create pipe for stdin/stdout of command.com(or 4dos.com) in C or Batch?
Shell script can be run only with sh command
Draw simple lines in Inkscape
Is it possible to do 50 km distance without any previous training?
Why is an old chain unsafe?
How can the DM most effectively choose 1 out of an odd number of players to be targeted by an attack or effect?
"which" command doesn't work / path of Safari?
Email Account under attack (really) - anything I can do?
When blogging recipes, how can I support both readers who want the narrative/journey and ones who want the printer-friendly recipe?
Is it tax fraud for an individual to declare non-taxable revenue as taxable income? (US tax laws)
Is there a familial term for apples and pears?
Copycat chess is back
Why Is Death Allowed In the Matrix?
How does one intimidate enemies without having the capacity for violence?
Circuitry of TV splitters
Japan - Plan around max visa duration
Why was the small council so happy for Tyrion to become the Master of Coin?
Download, install and reboot computer at night if needed
Do airline pilots ever risk not hearing communication directed to them specifically, from traffic controllers?
If Manufacturer spice model and Datasheet give different values which should I use?
black dwarf stars and dark matter
whey we use polarized capacitor?
Possibly bubble sort algorithm
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;
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
New contributor
|
show 9 more comments
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
New contributor
4
one way could be to check the float usingis_integer()
if that passes, convert it toint
?
– DirtyBit
Apr 4 at 7:47
5
Floats are approximations,1.0
could actually be1.00000000000001
or0.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
|
show 9 more comments
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
New contributor
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
python
New contributor
New contributor
edited Apr 4 at 14:52
DirtyBit
12.3k31943
12.3k31943
New contributor
asked Apr 4 at 7:46
Raymond ShenRaymond Shen
15024
15024
New contributor
New contributor
4
one way could be to check the float usingis_integer()
if that passes, convert it toint
?
– DirtyBit
Apr 4 at 7:47
5
Floats are approximations,1.0
could actually be1.00000000000001
or0.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
|
show 9 more comments
4
one way could be to check the float usingis_integer()
if that passes, convert it toint
?
– DirtyBit
Apr 4 at 7:47
5
Floats are approximations,1.0
could actually be1.00000000000001
or0.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
|
show 9 more comments
9 Answers
9
active
oldest
votes
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]
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 to1.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 that1.bit_length()
is illegal, but1 .bit_length()
(with a space after the1
, before the.
) works perfectly. :-)
– ShadowRanger
Apr 5 at 2:33
4
@accdias: That won't always work either, sincefloat
has representational limits whileint
does not. Passingx = 1 << 1024
will cause your code to die with anOverflowError
. So now you've got additional checks for safety, or exception handling.
– ShadowRanger
2 days ago
|
show 5 more comments
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'
This is great but I had a query yesterday that for some reason I couldn't ask, this would turn0.9
to1
but considering one only wants1.0
to1
or2.0
to2
and not0.9
to1
or1.9
to2
. 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 not0.9
or0.99
– Eric Duminil
2 days ago
exactly:print('%g' % 0.9999999999) # 1
but let's say the req. was to only have1
if it was1.0
and not0.9999999999
?
– DirtyBit
2 days ago
2
@DirtyBit: You can specify the desired accuracy :'%.15g' % 0.999999999999999
is'0.999999999999999'
and'%.2g' % 0.999
is'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
|
show 3 more comments
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
add a comment |
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.
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. Is1.0 + 1e-16
"close enough"? Is1.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 consider1.0 + 2e-16
"not an integer" while saying1.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
add a comment |
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.
New contributor
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 aunion
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 toint
,lambda x: y if (y:=int(x)) == x else x
.
– chepner
Apr 4 at 13:11
@chepner I triedfoo = 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
|
show 4 more comments
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
>>>
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 usedef 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
add a comment |
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
add a comment |
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]
New contributor
add a comment |
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)
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 usereturn
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
|
show 2 more comments
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.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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]
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 to1.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 that1.bit_length()
is illegal, but1 .bit_length()
(with a space after the1
, before the.
) works perfectly. :-)
– ShadowRanger
Apr 5 at 2:33
4
@accdias: That won't always work either, sincefloat
has representational limits whileint
does not. Passingx = 1 << 1024
will cause your code to die with anOverflowError
. So now you've got additional checks for safety, or exception handling.
– ShadowRanger
2 days ago
|
show 5 more comments
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]
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 to1.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 that1.bit_length()
is illegal, but1 .bit_length()
(with a space after the1
, before the.
) works perfectly. :-)
– ShadowRanger
Apr 5 at 2:33
4
@accdias: That won't always work either, sincefloat
has representational limits whileint
does not. Passingx = 1 << 1024
will cause your code to die with anOverflowError
. So now you've got additional checks for safety, or exception handling.
– ShadowRanger
2 days ago
|
show 5 more comments
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]
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]
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 to1.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 that1.bit_length()
is illegal, but1 .bit_length()
(with a space after the1
, before the.
) works perfectly. :-)
– ShadowRanger
Apr 5 at 2:33
4
@accdias: That won't always work either, sincefloat
has representational limits whileint
does not. Passingx = 1 << 1024
will cause your code to die with anOverflowError
. So now you've got additional checks for safety, or exception handling.
– ShadowRanger
2 days ago
|
show 5 more comments
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 to1.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 that1.bit_length()
is illegal, but1 .bit_length()
(with a space after the1
, before the.
) works perfectly. :-)
– ShadowRanger
Apr 5 at 2:33
4
@accdias: That won't always work either, sincefloat
has representational limits whileint
does not. Passingx = 1 << 1024
will cause your code to die with anOverflowError
. 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
|
show 5 more comments
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'
This is great but I had a query yesterday that for some reason I couldn't ask, this would turn0.9
to1
but considering one only wants1.0
to1
or2.0
to2
and not0.9
to1
or1.9
to2
. 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 not0.9
or0.99
– Eric Duminil
2 days ago
exactly:print('%g' % 0.9999999999) # 1
but let's say the req. was to only have1
if it was1.0
and not0.9999999999
?
– DirtyBit
2 days ago
2
@DirtyBit: You can specify the desired accuracy :'%.15g' % 0.999999999999999
is'0.999999999999999'
and'%.2g' % 0.999
is'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
|
show 3 more comments
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'
This is great but I had a query yesterday that for some reason I couldn't ask, this would turn0.9
to1
but considering one only wants1.0
to1
or2.0
to2
and not0.9
to1
or1.9
to2
. 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 not0.9
or0.99
– Eric Duminil
2 days ago
exactly:print('%g' % 0.9999999999) # 1
but let's say the req. was to only have1
if it was1.0
and not0.9999999999
?
– DirtyBit
2 days ago
2
@DirtyBit: You can specify the desired accuracy :'%.15g' % 0.999999999999999
is'0.999999999999999'
and'%.2g' % 0.999
is'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
|
show 3 more comments
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'
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'
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 turn0.9
to1
but considering one only wants1.0
to1
or2.0
to2
and not0.9
to1
or1.9
to2
. 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 not0.9
or0.99
– Eric Duminil
2 days ago
exactly:print('%g' % 0.9999999999) # 1
but let's say the req. was to only have1
if it was1.0
and not0.9999999999
?
– DirtyBit
2 days ago
2
@DirtyBit: You can specify the desired accuracy :'%.15g' % 0.999999999999999
is'0.999999999999999'
and'%.2g' % 0.999
is'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
|
show 3 more comments
This is great but I had a query yesterday that for some reason I couldn't ask, this would turn0.9
to1
but considering one only wants1.0
to1
or2.0
to2
and not0.9
to1
or1.9
to2
. 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 not0.9
or0.99
– Eric Duminil
2 days ago
exactly:print('%g' % 0.9999999999) # 1
but let's say the req. was to only have1
if it was1.0
and not0.9999999999
?
– DirtyBit
2 days ago
2
@DirtyBit: You can specify the desired accuracy :'%.15g' % 0.999999999999999
is'0.999999999999999'
and'%.2g' % 0.999
is'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.999
is '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.999
is '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
|
show 3 more comments
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
add a comment |
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
add a comment |
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
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
edited 22 hours ago
answered Apr 4 at 7:49
U9-ForwardU9-Forward
18k51744
18k51744
add a comment |
add a comment |
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.
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. Is1.0 + 1e-16
"close enough"? Is1.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 consider1.0 + 2e-16
"not an integer" while saying1.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
add a comment |
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.
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. Is1.0 + 1e-16
"close enough"? Is1.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 consider1.0 + 2e-16
"not an integer" while saying1.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
add a comment |
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.
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.
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. Is1.0 + 1e-16
"close enough"? Is1.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 consider1.0 + 2e-16
"not an integer" while saying1.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
add a comment |
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. Is1.0 + 1e-16
"close enough"? Is1.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 consider1.0 + 2e-16
"not an integer" while saying1.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
add a comment |
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.
New contributor
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 aunion
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 toint
,lambda x: y if (y:=int(x)) == x else x
.
– chepner
Apr 4 at 13:11
@chepner I triedfoo = 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
|
show 4 more comments
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.
New contributor
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 aunion
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 toint
,lambda x: y if (y:=int(x)) == x else x
.
– chepner
Apr 4 at 13:11
@chepner I triedfoo = 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
|
show 4 more comments
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.
New contributor
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.
New contributor
New contributor
answered Apr 4 at 10:33
Stefan KostoskiStefan Kostoski
111
111
New contributor
New contributor
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 aunion
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 toint
,lambda x: y if (y:=int(x)) == x else x
.
– chepner
Apr 4 at 13:11
@chepner I triedfoo = 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
|
show 4 more comments
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 aunion
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 toint
,lambda x: y if (y:=int(x)) == x else x
.
– chepner
Apr 4 at 13:11
@chepner I triedfoo = 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
|
show 4 more comments
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
>>>
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 usedef 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
add a comment |
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
>>>
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 usedef 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
add a comment |
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
>>>
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
>>>
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 usedef 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
add a comment |
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 usedef 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
add a comment |
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
add a comment |
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
add a comment |
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
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
answered 17 hours ago
Baruch G.Baruch G.
337
337
add a comment |
add a comment |
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]
New contributor
add a comment |
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]
New contributor
add a comment |
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]
New contributor
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]
New contributor
New contributor
answered 19 hours ago
SpinelSpinel
11
11
New contributor
New contributor
add a comment |
add a comment |
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)
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 usereturn
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
|
show 2 more comments
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)
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 usereturn
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
|
show 2 more comments
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)
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)
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 usereturn
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
|
show 2 more comments
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 usereturn
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
|
show 2 more comments
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.
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.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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
4
one way could be to check the float using
is_integer()
if that passes, convert it toint
?– DirtyBit
Apr 4 at 7:47
5
Floats are approximations,
1.0
could actually be1.00000000000001
or0.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