【问题标题】:Large lua numbers are being printed incorrectly大的 lua 数字打印不正确
【发布时间】:2016-04-18 02:32:48
【问题描述】:

我有以下测试用例:

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,我还没有找到另一个能给出正确值的数字。谁能解释为什么会发生这种情况?

【问题讨论】:

    标签: lua int64


    【解决方案1】:

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

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

    string.format("%i", bar)
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-14
        • 1970-01-01
        • 1970-01-01
        • 2021-09-21
        相关资源
        最近更新 更多