我正在使用Lua 5.1
print(10.08 - 10.07)
不是打印0.01,而是打印0.0099999999999998。
任何想法如何从这个减法中得到0.01?
答案 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。