我有以下测试案例:

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,我还没有找到一个可以提供正确值的数字。谁能解释为什么会这样?

最佳答案

log2(1000000000000000000)在59到60之间,这意味着该数字的二进制表示形式需要60位。 double精度浮点数仅具有53位精度,外加具有11位范围的2的幂。因此,要存储这么大的数字作为浮点数(这是您使用%f格式说明符所要求的),数字的末尾会切掉六到七位精度,然后将整个数乘以幂将其恢复到两个范围(我认为在这种情况下为259)。删除这些最后的位将消除允许10000000000000000001000000000000000001彼此区分的精度。

(这不是对浮点的特别精确的描述,如果我的数字或描述不准确,则表示歉意。)

08-07 12:30