2015-08-26 126 views
0

我知道浮點計算可能不準確的事實。例如:如何確保整數除法得出正確的結果?

var x = 100*0.333; 

這裏x被設置爲33.300000000000004,而不是33。這似乎是一個小問題,但如果涉及四捨五入,則會變得嚴重。例如,Math.ceil(x)將不正確 - 將產生34而不是33

問題是,我被告知JS在整數和浮點之間沒有太大的區別。所以我擔心是否有辦法確保整體分割是正確的。

JS中整數除法的通常公式似乎是Math.floor(n/m),其中n,m是整數。所以現在讓我們假設m均勻分配n。由於JS將每個數字視爲一個浮點數,所以n/m將返回一個浮點數。如果這個浮點數不準確,但甚至比實際計算結果小很多,那麼Math.floor(n/m)將舍入到它應該低於一個整數。

舉例說明:如果,例如,9/3產生2.999999999999999而非3,然後Math.floor(9/3)將錯誤地產生2而非3。其實,Math.floor(9/3)的確給出了正確的結果,但這當然只是一個例子;替換93與任何不幸的選擇整數。

這種情況會發生嗎?如果是這樣,有什麼辦法可以確保正確的結果?

+0

JavaScript中的所有數字都是雙精度浮點數。 – Pointy

+1

你不會使用'Math.round(2.99999999999)'而不是Math.floor嗎? – forgetso

+0

@forgetso沒有。我想要整數除法,下舍入。例如,我想從'23/4',而不是'6'獲得'5'。我希望'Math.floor(n/m)'會給我正確的結果,不管'n'和'm'是否可以被整除。 – gaazkam

回答

3

這種情況會發生嗎?

否。如果它們是整數(即沒有小數部分的浮點數)並均勻分割,則結果將是精確的,並且是一個整數。
如果不均勻分割,結果將始終大於整數除法的確切結果。你永遠不會得到應該是32.9999999…號碼。浮點結果與可表示的一樣精確,舍入不會破壞整個預定義。

0

如果將兩個數字相除的值應該是3那麼它就是。如果該值應該是2.999999999999,那將是。 Java不會做某種奇怪的隱藏舍入,上或下。如果您始終需要將價值向下舍入,然後使用樓層(x/y)即使值爲2.99999999999999999999999999999999999,它仍然會返回爲2.這就是Floor所做的。與細胞同樣的事情。如果值是3.0000000000000000000001那麼它將被設置爲4.我在大學教這個,這是它應該如何工作的。