【发布时间】:2010-08-28 01:56:11
【问题描述】:
我正在使用 Lua 5.1
print(10.08 - 10.07)
上面打印的是 0.0099999999999998,而不是打印 0.01。
知道如何从这个减法中得到 0.01 吗?
【问题讨论】:
标签: lua
我正在使用 Lua 5.1
print(10.08 - 10.07)
上面打印的是 0.0099999999999998,而不是打印 0.01。
知道如何从这个减法中得到 0.01 吗?
【问题讨论】:
标签: lua
你从减法中得到 0.01。它只是以重复小数的形式出现,精度损失很小。
Lua 使用 C 类型 double 来表示数字。在您将使用的几乎所有平台上,这都是一个 64 位二进制浮点值,精度约为 23 位十进制数字。但是,任何精度都不足以以二进制形式精确表示 0.01。这种情况类似于尝试用十进制写 1/3。
此外,您将减去两个幅度非常相似的值。这一切本身就会导致精度的额外损失。
解决方案取决于您的上下文。如果您在做会计,那么我强烈建议您不要使用浮点值来表示帐户值,因为这些小错误会累积,最终会出现或消失整美分(或更糟)。最好以整数美分存储帐户,然后除以 100 进行显示。
一般来说,答案是要意识到浮点固有的问题,其中之一就是这种小的精度损失。它很容易通过将答案四舍五入到适当的位数进行显示,并且从不比较计算结果是否相等。
一些背景资源:
编辑:毕竟添加了 WECSSKAFPA 文档。这确实值得研究,尽管在第一次通过时可能会显得有些不知所措。同样,Knuth Volume 2 涵盖了广泛的一般算术和浮点数的大部分内容。而且,由于 lhf 让我想起了它的存在,我插入了 Lua wiki 解释为什么浮点可以用作唯一的数字类型作为列表中的第一项。
【讨论】:
使用Lua的string.format函数:
print(string.format('%.02f', 10.08 - 10.07))
【讨论】:
【讨论】:
对 Lua 使用 Decimal Number Library。
【讨论】: