为什么在lua中乘法和除法有时精度不同?例如下面的例子

以下是相同的代码块:

print((1 / 10 - 0.1) == 0) -- true
print((1 * 0.1 - 0.1) == 0) -- true

print((3 / 10 - 0.3) == 0) -- true
print((3 * 0.1 - 0.3) == 0) -- false

最后一个是false,这意味着它不是0。

点赞
用户6834680
用户6834680
Lua 5.3.5  版权所有 (C) 1994-2018 Lua.org, PUC-Rio
> function a(x) return ("%A"):format(x) end
> a(0.1)
0X1.999999999999AP-4
> a(0.3)
0X1.3333333333333P-2
> a(0.1 * 3)
0X1.3333333333334P-2

它们由于舍入误差而不同。

更多细节:

0.1 =
0X1.9999999999999999999... * 2^(-4) =
(舍入)
0X1.999999999999A * 2^(-4) =
0X1.999999999999AP-4

0.3 =
0X1.333333333333333333... * 2^(-2) =
(舍入)
0X1.3333333333333 * 2^(-2) =
0X1.3333333333333P-2

0.1 * 3 =
0X1.999999999999AP-4 * 3 =
0X1.999999999999A * 2^(-4) * 3 =
0X4.CCCCCCCCCCCCE * 2^(-4) =
0X1.33333333333338 * 2^(-2) =
(舍入)
0X1.3333333333334  * 2^(-2) =
0X1.3333333333334P-2
2018-08-09 07:13:00