为什么在python中0.1 * 10等于1.0?

时间:2016-12-09 08:12:51

标签: python floating-point

当我尝试

时,我正在玩python
>>> Decimal(0.1)
Decimal('0.1000000000000000055511151231257827021181583404541015625')

我觉得这是正常的,因为浮点不准确。我还预计0.1 * 10会略大于1.0

然后我尝试了

>>> Decimal(0.1 * 10)
Decimal('1')
>>> 0.1 * 10 == 1.0
True

这很奇怪,因为它们不应该是平等的。

>>> sum = 0.0
>>> for i in range(10):
    sum += 0.1


>>> Decimal(sum)
Decimal('0.99999999999999988897769753748434595763683319091796875')

这也很奇怪,因为它应该略大于1.0

有人可以向我解释这个。

我不确定这是否相关,但我在Windows 8.1 64位上使用了python 3.5.2和python 2.7.12。

2 个答案:

答案 0 :(得分:6)

十进制0.1的确切值不能用64位二进制浮点表示,因此它会四舍五入到最接近的可表示值,即0.1000000000000000055511151231257827021181583404541015625。

但是,虽然精确值0.1000000000000000055511151231257827021181583404541015625 * 10可以用二进制表示,但它需要比64位二进制浮点更多的精度位。结果也会四舍五入到最接近的可表示值,结果表明最接近的可表示值正好是1.0。

基本上,你有两个舍入错误,它们恰好取消了。

答案 1 :(得分:0)

请注意,在浮点运算中,(通常)a + a + a不等于3 * a。大部分"正常"数学定律不适用。

对于乘法,使用其他算法而不是求和n次。这会导致不同的轮次误差。