我有以下测试案例:
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)。删除这些最后的位将消除允许1000000000000000000
和1000000000000000001
彼此区分的精度。
(这不是对浮点的特别精确的描述,如果我的数字或描述不准确,则表示歉意。)