Lua 使用(IEEE 754)64 位双精度浮点数这一事实让您感到震惊。
看下面的例子
> print(0.3 == 0.3)
true
> print(0.3 <= 0.3)
true
> print(0.3 >= 0.3)
true
0.3
in memory的实际值为:
> 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
:
> print(string.format("%1.64f",29.7-30))
-0.3000000000000007105427357601001858711242675781250000000000000000
的实际值为math.abs(29.7-30)
:
> print(string.format("%1.64f", math.abs(29.7-30))
0.3000000000000007105427357601001858711242675781250000000000000000
只是为了好玩,价值math.abs(-0.3)
是:
> print(string.format("%1.64f", math.abs(-0.3)))
0.2999999999999999888977697537484345957636833190917968750000000000
你的问题有两个解决方案,第一个是阅读每个计算机科学家应该知道的关于浮点运算的知识,并理解它:-)。第二种解决方案是将 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))
但是,您必须确保对所有比较都使用足够且相同的精度。