我的代码:
#!/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
输出:
sam@sam:~/code/python$ ./t2.py
1.6
1.55
1.56
sam@sam:~/code/python$
round(1.555, 1)
输出1.6
。
为什么不round(1.555, 2)
输出1.56
?
答案 0 :(得分:10)
注意
round()
对于浮点数的行为可能会令人惊讶:例如,round(2.675, 2)
给出2.67
而非预期2.68
。这不是一个错误:它是大多数十进制的结果 分数不能完全表示为浮点数。有关详细信息,请参阅 Floating Point Arithmetic: Issues and Limitations 。
如果你继续挖掘(即点击该链接),你会发现一个类似于你的例子:
内置
round()
函数的文档说明了这一点 舍入到最接近的值,从零开始四舍五入。自从 小数部分2.675
恰好位于2.67
和2.68
之间, 你可能期望这里的结果是(二进制近似)2.68
。它不是,因为当转换十进制字符串2.675
时 对于二进制浮点数,它再次被二进制替换 近似,其精确值为2.67499999999999982236431605997495353221893310546875
字符串格式化也无法解决您的问题。浮点数不会按照您预期的方式存储:
>>> '{:0.2f}'.format(1.555)
'1.55'
这不是真正的“修复”,但Python确实有一个decimal
模块,专为浮点运算而设计:
>>> from decimal import Decimal
>>> n = Decimal('1.555')
>>> round(n, 2)
Decimal('1.56')
答案 1 :(得分:6)
直接来自文档:
浮点数的round()行为可能会令人惊讶:例如, round(2.675,2)给出2.67而不是预期的2.68。这不是一个 bug:这是大多数小数部分不能的结果 完全代表浮动。有关详细信息,请参阅Floating Point Arithmetic: Issues and Limitations。
答案 2 :(得分:0)
来自http://docs.python.org/2/library/functions.html#round:
请注意
对于浮点数,round()的行为可能会令人惊讶:例如,round(2.675,2)给出2.67而不是预期的2.68。这不是一个错误:这是因为大多数小数部分不能完全表示为浮点数。有关详细信息,请参阅浮点运算:问题和限制。