【发布时间】:2017-01-29 20:16:57
【问题描述】:
我知道大多数小数没有精确的浮点表示 (Is floating point math broken?)。
但我不明白为什么 4*0.1 打印得很好,因为 0.4,但 3*0.1 不是,当
这两个值实际上都有丑陋的十进制表示:
>>> 3*0.1
0.30000000000000004
>>> 4*0.1
0.4
>>> from decimal import Decimal
>>> Decimal(3*0.1)
Decimal('0.3000000000000000444089209850062616169452667236328125')
>>> Decimal(4*0.1)
Decimal('0.40000000000000002220446049250313080847263336181640625')
【问题讨论】:
-
因为有些数字可以准确表示,有些则不能。
-
@MorganThrapp:不,不是。 OP 正在询问看起来相当随意的格式选择。 0.3 和 0.4 都不能用二进制浮点数精确表示。
-
@BartoszKP:多次阅读该文档后,它无法解释为什么 Python 将
0.3000000000000000444089209850062616169452667236328125显示为0.30000000000000004和0.40000000000000002220446049250313080847263336181640625显示为.4,即使它们看起来相同准确性,因此无法回答问题。 -
另请参阅stackoverflow.com/questions/28935257/… - 我有点恼火它被关闭为重复但这个没有。
-
已重新打开,请不要将其关闭,因为它与“浮点数学是否损坏”的重复。
标签: python floating-point rounding floating-accuracy ieee-754