Lua 使用 (IEEE 754) 64 位双精度浮点数这一事实让您感到震惊。
看下面的例子
> print(0.3 == 0.3)
true
> print(0.3 <= 0.3)
true
> print(0.3 >= 0.3)
true
实际价值0.3
记忆中是:
> print(string.format("%1.64f",math.abs(-0.3)))
0.2999999999999999888977697537484345957636833190917968750000000000
现在看看你的例子:
> print(math.abs(29.7-30) == 0.3)
false
> print(math.abs(29.7-30) >= 0.3)
true
> print(math.abs(29.7-30) <= 0.3)
false
实际价值29.7-30
is:
> print(string.format("%1.64f",29.7-30))
-0.3000000000000007105427357601001858711242675781250000000000000000
实际价值math.abs(29.7-30)
is:
> print(string.format("%1.64f", math.abs(29.7-30))
0.3000000000000007105427357601001858711242675781250000000000000000
只是为了好玩math.abs(-0.3)
is:
> print(string.format("%1.64f", math.abs(-0.3)))
0.2999999999999999888977697537484345957636833190917968750000000000
您的问题有两种解决方案,第一个是阅读每个计算机科学家都应该了解的浮点运算知识 http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html,并理解它:-)。第二种解决方案是配置 Lua 使用另一种类型的数字,请参阅值和类型 http://www.lua.org/manual/5.1/manual.html#2.2以获得提示。
Edit我只是想到了另一种“解决”问题的方法,但这有点麻烦,并且不能保证始终有效。您可以通过首先将浮点数转换为具有固定精度的字符串来在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))
但是,您必须确保使用的精度对于所有比较来说都是足够的且相同。