【问题标题】:Lua: subtracting decimal numbers doesn't return correct precisionLua:减去十进制数不会返回正确的精度
【发布时间】:2010-08-28 01:56:11
【问题描述】:

我正在使用 Lua 5.1

print(10.08 - 10.07)

上面打印的是 0.0099999999999998,而不是打印 0.01。

知道如何从这个减法中得到 0.01 吗?

【问题讨论】:

标签: lua


【解决方案1】:

你从减法中得到 0.01。它只是以重复小数的形式出现,精度损失很小。

Lua 使用 C 类型 double 来表示数字。在您将使用的几乎所有平台上,这都是一个 64 位二进制浮点值,精度约为 23 位十进制数字。但是,任何精度都不足以以二进制形式精确表示 0.01。这种情况类似于尝试用十进制写 1/3。

此外,您将减去两个幅度非常相似的值。这一切本身就会导致精度的额外损失。

解决方案取决于您的上下文。如果您在做会计,那么我强烈建议您不要使用浮点值来表示帐户值,因为这些小错误会累积,最终会出现或消失整美分(或更糟)。最好以整数美分存储帐户,然后除以 100 进行显示。

一般来说,答案是要意识到浮点固有的问题,其中之一就是这种小的精度损失。它很容易通过将答案四舍五入到适当的位数进行显示,并且从不比较计算结果是否相等。

一些背景资源:

编辑:毕竟添加了 WECSSKAFPA 文档。这确实值得研究,尽管在第一次通过时可能会显得有些不知所措。同样,Knuth Volume 2 涵盖了广泛的一般算术和浮点数的大部分内容。而且,由于 lhf 让我想起了它的存在,我插入了 Lua wiki 解释为什么浮点可以用作唯一的数字类型作为列表中的第一项。

【讨论】:

  • +1 非常好的答案。如果 OP 喜欢深入研究,我还想再添加一个参考 - “每个计算机科学家都应该知道的关于浮点数的知识”docs.sun.com/source/806-3568/ncg_goldberg.html
  • 我扔了一枚硬币,决定将其从列表中删除……第一次阅读时有点不知所措。但我绝对建议您也阅读和理解它,所以我会在更明显的地方编辑链接。
【解决方案2】:

使用Lua的string.format函数:

print(string.format('%.02f', 10.08 - 10.07))

【讨论】:

    【解决方案3】:

    【讨论】:

    • 如果您需要。这高度依赖于应用程序。
    【解决方案4】:

    对 Lua 使用 Decimal Number Library

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-01
      • 1970-01-01
      • 2012-01-07
      • 2021-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多