Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lua:减去十进制数不会';t返回正确的精度_Lua - Fatal编程技术网

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

Lua:减去十进制数不会';t返回正确的精度,lua,Lua,我正在使用Lua5.1 print(10.08 - 10.07) 上面打印的不是0.01,而是0.009999999998 你知道如何从这个减法中得到0.01吗?使用一个。使用Lua函数: print(string.format('%.02f', 10.08 - 10.07)) 你从减法中得到了0.01。它只是以一个重复的小数的形式出现,精度损失很小 Lua使用C typedouble表示数字。在您将使用的几乎所有平台上,这都是一个64位二进制浮点值,精度约为23位十进制数字。但是,任何精度

我正在使用Lua5.1

print(10.08 - 10.07)
上面打印的不是0.01,而是0.009999999998

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

使用一个。

使用Lua函数:

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

你从减法中得到了0.01。它只是以一个重复的小数的形式出现,精度损失很小

Lua使用C type
double
表示数字。在您将使用的几乎所有平台上,这都是一个64位二进制浮点值,精度约为23位十进制数字。但是,任何精度都不足以在二进制中精确表示0.01。这种情况类似于试图用十进制写1/3

此外,还要减去两个大小非常相似的值。这本身就造成了额外的精度损失

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

一般来说,答案是要注意浮点所固有的问题,其中之一就是精度的这种小损失。通过将答案四舍五入到适当的数字以供显示,并且从不比较计算结果是否相等,可以很容易地处理该问题

一些背景资料:

  • Lua用户Wiki上的
  • 这是一个很棒的页面,您可以在其中输入十进制值,并查看它们是如何表示的,反之亦然
  • 维基百科
  • 关于数字的维基
  • 是对细节最完整的讨论

编辑:毕竟添加了WECSSKAFPA文档。这确实是值得研究的,尽管在第一次通过时可能会显得有点势不可挡。同样,它也广泛地涵盖了算术和浮点运算。而且,由于lhf提醒了我它的存在,我插入了Lua wiki解释,为什么可以将浮点作为唯一的数字类型作为列表中的第一项

如果需要,请使用Lua。

。这在很大程度上取决于应用程序。+1回答得很好。我还想再添加一个参考资料,如果OP想深入研究的话——“每一位计算机科学家都应该知道的关于浮点数的知识”,我掷了一枚硬币,决定把它从列表中删除。。。一读就有点让人不知所措。但我绝对推荐阅读和理解它,所以我会在更可见的地方编辑链接。请参阅和以获取解释。