Convert '165.0' to int

Thomas 'PointedEars' Lahn PointedEars at web.de
Sun Jul 24 10:03:26 CEST 2011


Billy Mays wrote:

> On 7/21/2011 10:40 PM, Thomas 'PointedEars' Lahn wrote:
>> Billy Mays wrote:
>>> On 07/21/2011 08:46 AM, Web Dreamer wrote:
>>>> If you do not want to use 'float()' try:
>>>>
>>>> int(x.split('.')[0])
>>>
>>> This is right.
>>
>> Assuming that the value of `x' is in the proper format, of course.  Else
>> you might easily cut to the first one to three digits of a string
>> representation (if `.' is the thousands separator of the locale, e. g.)
> 
> The point (which was clear to me) was to convert a properly formatted
> string representation of a floating point number to an integer.  We
> might also assume the number could be a hex encoded float or be in
> scientific notation.  If the input is not properly formatted, it is
> unreasonable for us to return a correct value.

By "*proper* format" I was not referring to the user input.  It is not up to 
you to define which number formats in the rest of the world can be 
considered proper.  Indeed, Switzerland uses 1'234.56, and I find that quite 
reasonable, even though I am German and in Germany 1.234,56 is used (which I 
was referring to).
 
>>>> But, the problem is the same as with int(float(x)), the integer number
>>>> is still not as close as possible as the original float value.
>>>>
>>>> I would in fact consider doing this:
>>>>
>>>> int(round(float(x)))
>>>
>>> This is wrong, since there is a loss of information in the float cast:
>>>
>>>   >>>  float('9007199254740993.0')
>>> 9007199254740992.0
>>>
>>> Notice the last digit switched from a 3 to a 2?  Floats in python don't
>>> have arbitrary accuracy.  You would need to import decimal and use it
>>> for rounding to work properly.
>>
>> It should be floor() though, for that is what int() does.
>
> Um, what?

_____

>>> print math.floor.__doc__
floor(x)

Return the floor of x as a float.
This is the largest integral value <= x.
_____

The point I was trying to make was that round() would return a different 
result than intended by the OP when the fractional part was greater than
or equal to 0.5.  So it should not be used here.  Instead,

  from math import floor
  int(floor(float(x)))

should be used.  (I assumed before, without testing, that Python had a 
global floor() function.  Sorry.)

There is still the rounding error as there is no arbitrary precision with 
built-in floating-point values indeed – however, is it common that users 
enter such large numbers? I don't think so –, but no rounding error caused 
by programmer error.

>>> int(round(float('9007199254.5')))
9007199255L

>>> int(floor(float('9007199254.5')))
9007199254L

-- 
PointedEars

Bitte keine Kopien per E-Mail. / Please do not Cc: me.



More information about the Python-list mailing list