【发布时间】:2021-02-02 15:50:20
【问题描述】:
>>> .1+.1+.1+.1 ==.4
True
>>> .1+.1+.1 ==.3
False
>>>
以上是python解释器的输出。我了解
浮点运算是使用基数 2 完成的,并以二进制形式存储在
因此计算结果的差异类似于上述结果。
现在我发现 .4 = .011(0011) [() 里面的数字无限重复这是一个二进制
这个分数的表示] 因为这不能精确地存储一个近似值
将被存储。
相似度 0.3 = .01(0011)
所以 0.4 和 0.3 都不能完全在内部存储。
但是,python 首先返回 True 而第二个返回 False 的原因是什么
因为两者无法比较
_______________________________________________________________________________
我做了一些研究,发现以下内容:
>>> Decimal(.4)
Decimal('0.40000000000000002220446049250313080847263336181640625')
>>> Decimal(.1+.1+.1+.1)
Decimal('0.40000000000000002220446049250313080847263336181640625')
>>> Decimal(.1+.1+.1)
Decimal('0.3000000000000000444089209850062616169452667236328125')
>>> Decimal(.3)
Decimal('0.299999999999999988897769753748434595763683319091796875')
>>> Decimal(.1)
Decimal('0.1000000000000000055511151231257827021181583404541015625')
这可能解释了为什么添加会以它们的方式发生
假设 Decimal 给出了存储在下面的数字的确切输出
【问题讨论】:
-
您似乎已经回答了您自己的问题...或者您还有其他问题吗?
-
是的;仅仅因为没有一个单独的值是精确的,并不意味着它们不能产生等效的近似值。
-
这能回答你的问题吗? Is floating point math broken?
标签: python python-3.x floating-point decimal