大 lua 数字打印不正确

Large lua numbers are being printed incorrectly

我有以下测试用例:

Lua 5.3.2  Copyright (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,我还没有找到另一个给出正确值的数字。谁能解释一下为什么会这样?

您将数字格式化为浮点数,而不是整数。这就是 %.0f 正在做的事情。在某些时候,浮点数会失去精度。 double,例如,将在大约 16 位小数位后丢失精度。

如果要将整数格式化为整数,则需要将其格式化为整数,使用standard printf rules:

string.format("%i", bar)

log2(1000000000000000000)介于59和60之间,也就是说这个数的二进制表示需要60位。 double 精度浮点数只有 53 位精度,加上 11 位范围的二次方指数。因此,为了将这么大的数字存储为浮点数(这是您使用 %f 格式说明符所请求的),六到七位精度从数字的末尾切掉,整个数字乘以2 的幂使其回到范围内(我认为在这种情况下为 259)。砍掉那些最后的位会消除允许 10000000000000000001000000000000000001 彼此不同的精度。

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