Re: [Tutor] round() yields in-expected results/commercial rounding
by Daniel Ehrenberg other posts by this author
Dec 13 2003 4:57PM messages near this date
[Tutor] round() yields in-expected results/commercial rounding
|
Re: [Tutor] round() yields in-expected results/commercial rounding
Harm_Kirchhoff@[...].jp wrote:
> I have the following problem:
>
> >>> float(8.7)
> 8.6999999999999993
> >>> float(870)/100
> 8.6999999999999993
> >>> 8.7 * 100
> 869.99999999999989
> >>> round(8.7,2)
> 8.6999999999999993
> >>> math.modf(8.7)
> (0.69999999999999929, 8.0)
> >>> int(float(8.7*100))
> 869
>
> especially anoying is:
> >>> n = float(8.7*100) ; print n
> 870.0
> >>> n
> 869.99999999999989
> >>>
>
> How can I ensure that 8.7 stays 8.7, so that
> 8.7 * 100 = 870 and not 869.9999...
>
> The way I came up with is:
> >>> f = float(8.7*100) ; i = int(f) ; i,f
> (869, 869.99999999999989)
> >>> if f>=(i+.5): i += 1 ; i
>
> 870
>
> I am writing a commercial sales database. To save
> memory I use integers
> internally, rather than floats.
> This means that an amount of 8.70 is converted to
> 870 internally.
> if it is converted to 869 I loose 1/10.
This is annoying, but the only way short of using a
library to perform this simple task that I can thing
of is to convert the float into a string and then into
an integer. Here's a simple function that does that:
> >> convert = lambda x: int(str(x*100)[:-2])
> >> convert(8.7)
870
You need the [:-2] to truncate the last two letters
because otherwise it would be in the form '870.0',
which it can't handle.
Daniel Ehrenberg
__________________________________
Do you Yahoo!?
New Yahoo! Photos - easier uploading and sharing.
http://photos.yahoo.com/
_______________________________________________
Tutor maillist - Tutor@[...].org
http://mail.python.org/mailman/listinfo/tutor
Thread:
Daniel Ehrenberg
Michael Janssen
|