0

如果我在 Python 2.7.1 shell 或 3.3.2 shell 中键入以下内容:

a = 0.1
b = 0.1
(a + b) == 0.2

它返回值true。从 stackoverflow 和来自 MIT 的这个视频中,我的印象是这会返回false,因为尝试在计算机中准确表示 0.1 时会出现小错误。(毕竟它不是二进制的吗?)所以我猜 Python 必须是 a) 进行非浮点运算或 b) 在进行相等性测试之前进行舍入。

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

4

2 回答 2

6

他们都没有。是“运气”。浮点表示+算术为您选择的数字提供相同的值。

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

您可以使用该decimal模块向您展示:

>>> 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')
于 2013-12-28T23:02:02.930 回答
4

更深入的解释:0.1 十进制不能完全表示为有限二进制浮点数,因此这两个实例都会0.1引入小错误(小于 2**53 中的 1 部分,因为 Python 浮点数中有 53 位精度在几乎所有机器上,Python 会进行最佳舍入)。但浮动加法有其自身的舍入误差。有时错误会抵消。

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

于 2013-12-28T23:07:52.097 回答