哪个版本的Python默认使用有理算法?

时间:2013-12-28 22:58:11

标签: 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和this video from MIT开始,我认为这会返回false,因为在尝试在计算机中准确表示0.1时会出现小错误。 (毕竟不是二进制吗?)所以我猜Python必须是a)进行非浮点算术或b)在进行相等性测试之前进行舍入。

它是哪个版本以及哪些版本的Python有这种行为?

2 个答案:

答案 0 :(得分:5)

他们都不是。这是“运气”。浮点表示+算术为您选择的数字赋予相同的值。

>>> (0.1 + 0.1) == 0.2
True
>>> (0.1 + 0.2) == 0.3
False

您可以使用decimal module向您显示:

>>> 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')

答案 1 :(得分:3)

有一个更深层次的解释:0.1十进制不能完全表示为有限二进制浮点数,因此0.1的两个实例都会引入小错误(2 ** 53中少于1个部分,因为有几乎所有机器上的Python都有53位精度浮点数,而且Python可以实现最佳舍入。但浮动添加受其自身舍入错误的影响。有时错误会被取消。

所以“运气”是一个足够准确的描述。如果您想使用无界的有理数,请参阅标准fractions模块的文档。