我正在阅读关于floating-point issues and limits的Python文档。
大约在页面的一半,它说:
有趣的是,有许多不同的十进制数共享相同的最接近的近似二进制分数。例如,数字0.1和0.10000000000000001和0.1000000000000000055511151231257827021181583404541015625都近似为3602879701896397/2 ** 55.由于所有这些十进制值共享相同的近似值,因此可以显示其中任何一个,同时仍保留不变
eval(repr(x)) == x
。
特别是,它想说什么:
由于所有这些十进制值共享相同的近似值,因此可以显示其中任何一个,同时仍保留不变
eval(repr(x)) == x
Python不会截断超过15位十进制数的浮点数吗?有什么例子吗?
答案 0 :(得分:4)
重点是,无论最初提供多少个额外数字,您都会获得repr()
的相同输出,
>>> repr(0.1)
'0.1'
>>> repr(0.1000000000000000055511151231257827021181583404541015625)
'0.1'
那么,为什么不打印两者的较长版本?
# Hypothetically...
>>> repr(0.1)
'0.1000000000000000055511151231257827021181583404541015625'
>>> repr(0.1000000000000000055511151231257827021181583404541015625)
'0.1000000000000000055511151231257827021181583404541015625'
因此,有多种方法可以打印出相同的数字。 Python使用dtoa()
函数选择最短方式打印出给定的数字,在这种情况下,最短的方式是0.1
。
0.1
实际上并不准确:确切的结果是较长的一个,但dtoa()
将数字打印出来时将数字四舍五入,只要四舍五入的数字将四舍五入为原始数字。回读时的数字。换句话说,
float(repr(x)) == x
...即使float()
和repr()
围绕他们的论点。
答案 1 :(得分:3)
除了Dietrich Epp的优秀答案之外,这个答案还特别针对以下问题:" Python不会截断超过15位十进制数的浮点数?任何例子?"。
考虑以下Python会话:
$ python
Python 2.7.5 (default, Oct 2 2013, 22:34:09)
[GCC 4.8.1] on cygwin
Type "help", "copyright", "credits" or "license" for more information.
>>> x = 0.10000000000000001249000902703301107976585626602172851562500000000000000000000000000000000000000000000001
>>> x
0.10000000000000002
>>> y = 0.10000000000000001249000902703301107976585626602172851562500000000000000000000000000000000000000000000000
>>> y
0.1
>>>
分配给x
和y
的文字只有非常低的有效数字 - 您可能需要滚动才能看到它 - 但x
和y
有不同的价值观显然,如果Python基于15个十进制数字截断,情况就不是这样了。
相反,它选择最接近十进制文字的IEEE 64位二进制浮点数,并将关系四舍五入到具有零最低有效分数位的一个。我选择y
恰好是两个可表示数字之间的中间位置,但是四舍五入。 x
只是更大一点,所以它会四舍五入。