Lua未能评估数学。abs(29.7-30)<;=0.3

Lua未能评估数学。abs(29.7-30)<;=0.3,lua,Lua,今天早上我在我的Lua脚本上发现了一个bug,看起来很奇怪。这种评估怎么会以这种方式失败?示例可以在中进行测试 第一个例子: if( math.abs(29.7 - 30) <= 0.3 ) then result = 1 else result = 0 end print("result = "..result ) -->> result = 0 我真的很困惑,我想了解这一点,以避免将来出现类似的错误。谢谢 正如我们所知,浮点运算存在精度问题 参考: a=1 如果

今天早上我在我的Lua脚本上发现了一个bug,看起来很奇怪。这种评估怎么会以这种方式失败?示例可以在中进行测试

第一个例子:

if( math.abs(29.7 - 30) <=  0.3 ) then
  result = 1
else
  result = 0
end
print("result = "..result )
-->> result = 0
我真的很困惑,我想了解这一点,以避免将来出现类似的错误。谢谢

正如我们所知,浮点运算存在精度问题

参考:

a=1

如果a<1,则打印(),因为Lua使用(ieee754)64位双精度浮点数

请看以下示例
>打印(0.3==0.3)

true

>打印(0.3打印(0.3>=0.3)

true

内存中
0.3
的实际值为:
>打印(string.format(“%1.64f”,math.abs(-0.3))

0.29999999999988897769753748434595763683319091796875000000000

现在看看你的例子:
>打印(数学abs(29.7-30)=0.3)

false

>打印(数学abs(29.7-30)>=0.3)

true

>打印(math.abs(29.7-30)打印(string.format(“%1.64f”,29.7-30))

-0.300000000000000710542735760100185871124267578125000000000000000

math.abs(29.7-30)
的实际值为:
>打印(string.format(“%1.64f”,math.abs(29.7-30))

0.300000000000000710542735760100185871124267578125000000000000000

为了好玩,
math.abs(-0.3)
的值是:
>打印(string.format(“%1.64f”,math.abs(-0.3))

0.29999999999988897769753748434595763683319091796875000000000

有两种解决方案可以解决这个问题,第一种是阅读,并理解它:-)。第二种解决方案是将Lua配置为使用另一种类型的数字,请参阅以获取提示

编辑 我刚刚想到了另一种“解决”这个问题的方法,但这有点老套,不能保证总是有效。你可以在lua中使用定点数字,首先将浮点转换为具有固定精度的字符串

在您的情况下,这看起来像:

a = string.format("%1.1f", math.abs(29.7 - 30))
print(a == "0.3")
或者更健壮一点:

a = string.format("%1.1f", math.abs(29.7 - 30))
print(a == string.format("%1.1f", 0.3))

然而,你必须确保在所有的比较中使用一个足够且相同的精度。

这是公理,在我所知道的每一个数字系统中,
1=1
,因此
1<1
1>1
永远不可能是真的。是的,这是一个有点不同的情况。哦,我的上帝,我永远不会想到这一点t、 非常好的理由。我真的很惊讶。有什么建议可以让它工作吗?像这样?与0.31相比?我最好的建议是在我所做的编辑中,除了理解它之外,真的没有简单的方法来解决这个问题。请注意,在这种情况下,问题是对精确相等性的测试。虽然有些情况下,你可以如果要从浮点计算中获得精确的结果,则不属于这种情况。使用任意精度表示的替代方法在计算上非常昂贵,因此需要折衷。引用的文章进行了深入的解释。非常感谢提供的提示。我正在研究类似的问题来解决,但我很高兴我能够解决正确的方法。非常感谢另一篇非常有趣的文章。
对此有什么建议吗?
=>乘以10,转换为整数,使用整数,计算后除以10。
a = 1
if a < 1 then print("<1") end
a = string.format("%1.1f", math.abs(29.7 - 30))
print(a == "0.3")
a = string.format("%1.1f", math.abs(29.7 - 30))
print(a == string.format("%1.1f", 0.3))