Lua 的十进制精度丢失问题

请问为什么在 Lua 中执行以下代码:

return 256.65 * 1000000 + .000000005 - 256 * 1000000

结果为 649999.99999997,而运行以下代码:

return 255.65 * 1000000 + .000000005 - 255 * 1000000
return 268.65 * 1000000 + .000000005 - 268 * 1000000

则结果为 650000.0?

据我观察,这似乎是一个仅限于小数点后第 65 位(看起来也是第 15 位)和 256 到 267 范围内整数的问题。我知道这与使用浮点数进行这些计算有关,但我仍然很好奇这些特定值有什么特殊之处。

点赞
用户107090
用户107090

这些值的特殊之处在于,0.65不是二进制小数(即使它是十进制小数),因此无法在浮点数中精确表示。

就记录而言,这不局限于Lua。C中也会发生同样的事情。

2016-11-11 18:10:29
用户501459
用户501459

与十进制下的 10/3 是一个无限循环小数的原因相同。在三进制下,除以 3 将产生整数。在二进制下(用于表示计算机中的数字),所产生的数字同样会产生可以精确表示的分数。

深入阅读。

2016-11-12 06:38:17