Steven D'Aprano <[email protected]> added the comment:
math.remainder performs *floating point* remainder. That means it has to
convert the arguments to floats first, and there is no float capable of
representing either of those two numbers exactly:
py> '%f' % float(12345678901234567890)
'12345678901234567168.000000'
py> '%f' % float(12345678901234567891)
'12345678901234567168.000000'
That's just the way floats work. They don't have infinite precision, so
sometimes they have rounding error.
If you want exact integer remainder, use the `%` operator:
py> 12345678901234567890 % 3
0
py> 12345678901234567891 % 3
1
See the tutorial and the FAQs
https://docs.python.org/3/tutorial/floatingpoint.html
https://docs.python.org/3/faq/design.html#why-are-floating-point-calculations-so-inaccurate
----------
nosy: +steven.daprano
resolution: -> not a bug
stage: -> resolved
status: open -> closed
_______________________________________
Python tracker <[email protected]>
<https://bugs.python.org/issue39525>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com