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

use*_*445 4 lua

我正在使用Lua 5.1

print(10.08 - 10.07)
Run Code Online (Sandbox Code Playgroud)

而不是打印0.01,上面打印0.0099999999999998.

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

RBe*_*eig 12

你从减法得到0.01.它只是一个重复小数的形式,具有很小的精度损失.

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

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

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

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

一些背景资源:

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