Unexpected behaviour of math.floor, round and int functions (rounding)

Chris Angelico rosuav at gmail.com
Fri Nov 19 15:17:53 EST 2021


On Sat, Nov 20, 2021 at 5:08 AM ast <ast at invalid> wrote:
>
> Le 19/11/2021 à 03:51, MRAB a écrit :
> > On 2021-11-19 02:40, 2QdxY4RzWzUUiLuE at potatochowder.com wrote:
> >> On 2021-11-18 at 23:16:32 -0300,
> >> René Silva Valdés <rene.silva.valdes at gmail.com> wrote:
> >>
> >>> Hello, I would like to report the following issue:
> >>>
> >>> Working with floats i noticed that:
> >>>
> >>> int(23.99999999999999/12) returns 1, and
> >>> int(23.999999999999999/12) returns 2
> >>>
> >>> This implies that int() function is rounding ...
> >>
> >> It's not int() that's doing the rounding; that second numerator is being
> >> rounded before being divided by 12:
> >>
> >>      Python 3.9.7 (default, Oct 10 2021, 15:13:22)
> >>      [GCC 11.1.0] on linux
> >>      Type "help", "copyright", "credits" or "license" for more
> >> information.
> >>      >>> 23.999999999999999
> >>      24.0
> >>      >>> (23.999999999999999).hex()
> >>      '0x1.8000000000000p+4'
> >>
> > I think this is a bit clearer because it shows that it's not just being
> > rounded for display:
> >
> > Python 3.10.0 (tags/v3.10.0:b494f59, Oct  4 2021, 19:00:18) [MSC v.1929
> > 64 bit (AMD64)] on win32
> > Type "help", "copyright", "credits" or "license" for more information.
> >  >>> 23.99999999999999 == 24
> > False
> >  >>> 23.999999999999999 == 24
> > True
>
>  >>> 0.3 + 0.3 + 0.3 == 0.9
> False

That's because 0.3 is not 3/10. It's not because floats are
"unreliable" or "inaccurate". It's because the ones you're entering
are not what you think they are.

When will people understand this?

(Probably never. Sigh.)

ChrisA


More information about the Python-list mailing list