My code:
#!/usr/bin/python
# -*- coding: utf-8 -*-
print (round(1.555, 1)) # It seems normal
print (round(1.555, 2)) # Why it is not output 1.56?
print (round(1.556, 2)) # It seems normal
Output:
sam@sam:~/code/python$ ./t2.py
1.6
1.55
1.56
sam@sam:~/code/python$
round(1.555, 1) outputs 1.6.
Why doesn't round(1.555, 2) output 1.56?
Take a look at the documentation:
Note The behavior of
round()for floats can be surprising: for example,round(2.675, 2)gives2.67instead of the expected2.68. This is not a bug: it’s a result of the fact that most decimal fractions can’t be represented exactly as a float. See Floating Point Arithmetic: Issues and Limitations for more information.
If you keep digging (i.e. click that link), you'll find an example similar to yours:
The documentation for the built-in
round()function says that it rounds to the nearest value, rounding ties away from zero. Since the decimal fraction2.675is exactly halfway between2.67and2.68, you might expect the result here to be (a binary approximation to)2.68. It’s not, because when the decimal string2.675is converted to a binary floating-point number, it’s again replaced with a binary approximation, whose exact value is2.67499999999999982236431605997495353221893310546875
String formatting won't fix your problem either. The floating point number just isn't stored the way you'd expect it to be:
>>> '{:0.2f}'.format(1.555)
'1.55'
This isn't really a "fix", but Python does have a decimal module, which is designed for floating point arithmetic:
>>> from decimal import Decimal
>>> n = Decimal('1.555')
>>> round(n, 2)
Decimal('1.56')
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With