我正在做一些计算,我有这样的事情:
newInteger = 200
newFloat = 200.0
if newInteger >= newFloat:
print "Something"
当我运行我的应用程序时它没有打印出来但是当我在python shell上测试时,它会打印Something
!!。
所以我测试一下,
>>> number = 200.0000000000001
>>> number
200.0000000000001
但当小数超过13时,就像这样:
>>> number = 200.00000000000001
>>> number
200.0
python会隐藏十进制数字但是显示为四舍五入吗?在调试时知道结果非常重要。
有什么方法可以得到完整的小数? (我确实查看了python文档,它没有说明打印实际的浮点数。)
答案 0 :(得分:4)
Python倾向于对数字进行舍入:
>>> math.pi
3.141592653589793
>>> "{0:.50f}".format(math.pi)
'3.14159265358979311599796346854418516159057617187500'
>>> "{0:.2f}".format(math.pi)
'3.14'
但是,浮点数具有特定的精度,你无法使用它。您不能以浮点存储任意数字:
>>> number = 200.00000000000001
>>> "{:.25f}".format(number)
'200.0000000000000000000000000'
对于整数,浮点数限制为2 ** 53:
>>> 2.0**53
9007199254740992.0
>>> 2.0**53 + 1
9007199254740992.0
>>> 2.0**53 + 2
9007199254740994.0
如果要存储任意十进制数,则应使用十进制模块:
>>> from decimal import Decimal
>>> number = Decimal("200.0000000000000000000000000000000000000000001")
>>> number
Decimal('200.0000000000000000000000000000000000000000001')
答案 1 :(得分:4)
它被称为浮点舍入错误。它与Python存储浮点数(二进制)有关,这使得浮点数不可能具有100%的精度。
以下是docs中的更多信息。
如果您需要更高的精度,请参阅decimal
模块。
如果你只想快速比较两个数字,浮点数比较会有一些技巧。其中最受欢迎的是将相对误差与机器精度(epsilon)进行比较:
import sys
def float_equality(x, y, epsilon=sys.float_info.epsilon):
return abs(x - y) <= epsilon * max(abs(x), abs(y))
但这也不完美。有关此方法的不完善之处以及一些更准确的替代方法的讨论,请参阅此article about comparing floats。