你受到了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
的實際值是:
> 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
有兩種解決方案你親第一個是What Every Computer Scientist Should Know About Floating-Point Arithmetic,理解它:-)。第二個解決方案是將Lua配置爲使用其他類型的數字,請參閱Values and Types提示。
編輯 我只是想到了另一種「解決」問題的方式,但它有點破解,而且不保證總能正常工作。您可以在lua中使用固定點數字,首先將float轉換爲具有固定精度的字符串。
在你的情況,將是這個樣子:
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))
但是你必須確保你使用的精度,既充分和相同所有你比較。
來源
2013-05-02 08:11:05
jbr
哦,我的上帝。我從來沒有這樣做過。非常好的理由。我真的很驚訝。任何建議使這項工作?喜歡這個? 對比0.31? – MRodrigues 2013-05-02 08:26:31
我的最佳建議是在我編輯的編輯中,除了理解它之外,沒有簡單的解決方法。 – jbr 2013-05-02 08:32:05
請注意,這是一個問題是測試精確相等的情況。雖然有些情況下您可以從浮點計算得到準確的結果,但這不是其中的一種情況。使用任意精度表示的替代方案在計算上非常昂貴,因此需要妥協。引用的文章深入解釋。 – RBerteig 2013-05-02 09:04:12