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

我正在使用 Lua 5.1

print(10.08 - 10.07)

与其打印 0.01,上面的代码打印出了 0.0099999999999998。

有什么办法可以从这个减法中得到 0.01 吗?

原文链接 https://stackoverflow.com/questions/3580486

点赞
stackoverflow用户20862
stackoverflow用户20862

使用一个任意精度库

2010-08-27 00:12:44
stackoverflow用户893
stackoverflow用户893

使用 Lua 的 string.format 函数:

print(string.format('%.02f', 10.08 - 10.07))
2010-08-27 00:24:58
stackoverflow用户68204
stackoverflow用户68204

你从减法中得到了0.01。它只是以一个重复的小数形式存在,并略有失精度。

Lua使用C类型“double”来表示数字。几乎在你使用的每个平台上,它都是一个大约具有23个小数位精度的64位二进制浮点值。但是,没有任何数量的精度足以准确地用二进制表示0.01。这种情况类似于试图用十进制写1/3。

此外,您正在减去两个大小非常相似的值。这本身就会导致额外的精度损失。

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

总的来说,答案是要注意浮点固有的问题,其中之一就是这种小的精度损失。可以通过将答案四舍五入到适当的位数以供显示,并永远不比较计算结果的平等来轻松处理它们。

一些背景资源:

编辑: 在所有之后添加了WECSSKAFPA文档。虽然第一次通读时可能会有点压倒,但它确实值得一读。同样,Knuth Volume 2涵盖了算术的广泛内容,以及关于浮点的大量部分。由于lhf提醒我它的存在,因此我将Lua维基对为什么浮点是唯一的数值类型的解释作为列表中的第一个项目插入。

2010-08-27 06:48:38
stackoverflow用户33252
stackoverflow用户33252
2010-08-27 17:37:37