默认情况下,哪些版本的Python使用rational算术?
如果我在Python 2.7.1 shell或3.3.2 shell中键入以下内容:默认情况下,哪些版本的Python使用rational算术?,python,python-3.x,floating-point,rational-number,Python,Python 3.x,Floating Point,Rational Number,如果我在Python 2.7.1 shell或3.3.2 shell中键入以下内容: a = 0.1 b = 0.1 (a + b) == 0.2 它返回值true。从stackoverflow和,我的印象是这将返回false,因为在计算机中尝试精确表示0.1时会出现小错误。(它到底不是二进制的吗?) 哪个版本的Python具有这种行为?它们都没有。这是“运气”。浮点表示+算术为您拾取的数字提供相同的值 >>> (0.1 + 0.1) == 0.2 True >>
a = 0.1
b = 0.1
(a + b) == 0.2
它返回值true
。从stackoverflow和,我的印象是这将返回false
,因为在计算机中尝试精确表示0.1时会出现小错误。(它到底不是二进制的吗?)
哪个版本的Python具有这种行为?它们都没有。这是“运气”。浮点表示+算术为您拾取的数字提供相同的值
>>> (0.1 + 0.1) == 0.2
True
>>> (0.1 + 0.2) == 0.3
False
您可以使用显示以下内容:
>>> import decimal
>>> decimal.getcontext().prec = 60
>>> decimal.Decimal(0.1)
Decimal('0.1000000000000000055511151231257827021181583404541015625')
>>> decimal.Decimal(0.2)
Decimal('0.200000000000000011102230246251565404236316680908203125')
>>> decimal.Decimal(0.1) + decimal.Decimal(0.1)
Decimal('0.2000000000000000111022302462515654042363166809082031250')
更深入的解释是:0.1十进制不能精确地表示为有限二进制浮点,因此
0.1
的两个实例都引入了小错误(小于2**53中的1部分,因为几乎所有机器上的Python浮点都有53位精度,Python做了最好的四舍五入)。但浮动加法也会受到自身舍入误差的影响。有时错误会被抵消
所以“运气”是一个足够准确的描述。如果您想改用无界有理数,请参阅标准分数模块的文档。尝试
0.1+0.2==0.3
。错误不一定总是发生。@BartoszKP:LOL,我选择了相同的数字:)@KarolyHorvath;我记得他们,因为最近有一个问题特别是:)我还不能接受答案,否则我会接受。还有一个问题:如何看到0.1或0.2的“实际”表示?我知道使用print语句就可以找到答案,但即使我只是在解释器中键入0.1
,它也会简单地吐出0.1
**编辑:我知道你已经准备好回答这个问题了。谢谢@AmadeusDrZaius,当前版本的Python显示最短的十进制字符串,当读回时,该字符串将精确地再现浮点。你输入的这么多十进制字符串会被逐字回复。@TimPeters明白了。谢谢你,蒂姆!“幸运”的一部分是x+x
始终是二进制的精确操作(除非溢出)。