Lua:减去十进制数不会返回正确的精度

时间:2010-08-27 00:11:29

标签: lua

我正在使用Lua 5.1

print(10.08 - 10.07)

不是打印0.01,而是打印0.0099999999999998。

任何想法如何从这个减法中得到0.01?

4 个答案:

答案 0 :(得分:12)

你从减法得到0.01。它只是重复小数的形式,具有很小的精确度。

Lua使用C类型double来表示数字。这几乎是您将使用的每个平台上的64位二进制浮点值,精度约为23位十进制数。但是,没有多少精度足以用二进制表示0.01。这种情况类似于尝试用十进制写1/3。

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

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

一般来说,答案是要意识到浮点固有的问题,其中之一就是这种精确度的微小损失。通过将答案舍入到适当数量的数字进行显示,并且从不比较计算结果是否相等,可以轻松处理。

一些背景资源:

编辑:毕竟添加了WECSSKAFPA文档。这项研究确实值得,尽管第一次通过它似乎有点压倒性。同样,Knuth Volume 2对算术进行了广泛的覆盖,并对浮点进行了大量的研究。并且,由于lhf提醒我它的存在,我插入了Lua wiki解释为什么浮点可以用作唯一的数字类型作为列表中的第一项。

答案 1 :(得分:3)

使用Lua的string.format功能:

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

答案 2 :(得分:1)

答案 3 :(得分:1)

使用Decimal Number Library代表Lua。