如果超过13,Python隐藏浮动小数?

时间:2016-03-17 11:58:37

标签: python

我正在做一些计算,我有这样的事情:

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文档,它没有说明打印实际的浮点数。)

2 个答案:

答案 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