Lua 中需要长整型时会出现错误的打印结果

我有以下测试用例:

Lua 5.3.2  版权所有 (C) 1994-2015 Lua.org, PUC-Rio
> foo = 1000000000000000000
> bar = foo + 1
> bar
1000000000000000001
> string.format("%.0f", foo)
1000000000000000000
> string.format("%.0f", bar)
1000000000000000000

最后一行应该是 1000000000000000001,因为这是 bar 的值,但由于某个原因,它并不是。这不仅适用于 1000000000000000000,我还没有发现另一个超过该值的数字能给出正确的值。有人可以解释为什么会这样吗?

点赞
用户734069
用户734069

你正在将数字格式化为浮点数,而不是整数。这就是 %.0f 的作用。在某些情况下,浮点数会失去精度。例如,double 在大约 16 位小数后就会失去精度。

如果您想将整数格式化为整数,则需要按照 标准 printf 规则 将其格式化为整数:

string.format("%i", bar)
2016-04-17 18:25:34
用户5696
用户5696

log2(1000000000000000000) 在 59 和 60 之间,这意味着该数字的二进制表示需要 60 位。double 类型的浮点数只有 53 位的精度,加上一个具有 11 位范围的 2 的幂指数。因此,为了将如此大的数字存储为浮点数(这是您使用 %f 格式说明符请求的),需要从数字末尾切掉六到七位精度,然后将整个数字乘以 2 的幂计算回范围内(在这种情况下是 259)。切掉那些最后的位数会使 10000000000000000001000000000000000001 相互区分的精度消失。

(这并不是浮点数的特别精确的描述,如果我的数字或描述不准确,请谅解。)

2016-04-17 18:32:48