2
的math.sqrt(2)
結果似乎是不合理的,從而發生這種情況:的Lua - 全面提高一倍
> return math.sqrt(2)
1.4142135623731
> return math.sqrt(2) == 1.4142135623731
false
如何讓我這個「非理性」的變量一樣,如果我得到的變量不同的方式(如在上面的例子)?
的math.sqrt(2)
結果似乎是不合理的,從而發生這種情況:的Lua - 全面提高一倍
> return math.sqrt(2)
1.4142135623731
> return math.sqrt(2) == 1.4142135623731
false
如何讓我這個「非理性」的變量一樣,如果我得到的變量不同的方式(如在上面的例子)?
該變量不是非理性的,它是浮點的,所以它甚至不是真實的。 (雖然2的平方根是不合理的,因此不能準確地表示它)
只需使用更多的數字作爲文字,並且往返轉換就可以工作。 IEEE雙精度浮點值需要17位十進制數字來安全地表示它,而不是14.
讓我們看看發生什麼事情時,我們採取數字1並提高它在最不重要的位。 (在「0X」是指數字是十六進制這使我更容易控制在這個例子中的位。):
x = 0x1.0000000000001
> print(x == 1)
false
> print(('%.16g'):format(x))
1
> print(('%.17g'):format(x))
1.0000000000000002
Lua中刪去了最後兩個數字故意隱瞞簡單的數字的「非理性」,這樣的作爲'(1/3)* 3' :) –
爲什麼你需要使用'=='來完全相等的值?也許更容易一些(比如將數字重新設置爲固定精度的字符串或允許一些錯誤)可以滿足您的需求嗎? – hugomg