2014-09-20 77 views
0

我看到這個在JavaScriptJavaScript的數學問題

2-(1/3 * 1) // => Returns 1.66666666667 

但是,

4-(1/3 * 7) // => Returns 1.6666666667 

這比以前的結果少了一個6。這很糟糕,因爲這兩個表達式都等於5/3

我試圖用Python做同樣的事情,並且這兩個表達式都返回了相同的結果。

+0

這就是您的IDE決定報告的任意精度。如果您關心以特定精度報告,請手動指定。 – CoryKramer 2014-09-20 22:10:58

+4

是的。你的問題是什麼?如果你在結果中依賴於特定數量的六分之一,那麼你將處於非常不穩定的狀態。 – Borodin 2014-09-20 22:11:26

+0

請問有人知道通常的*浮點精度*資源鏈接到? – Borodin 2014-09-20 22:13:36

回答

1

這是因爲中間體是不同數量級:

0.3333333333333333 * 1 
#>>> 0.3333333333333333 

0.3333333333333333 * 7 
#>>> 2.333333333333333 

這意味着第一將被舍入到比第二8倍更大的粒度。由於Python的repr非常漂亮,並且精確到浮點數,所以它顯示爲10倍的粒度差異。

直觀地比較:

0.3333333333333333 
2.333333333333333 

看他們如何有相同數量的顯著的數字,但不同的小數位數。

當你做number - multiplication時,你最終會「解除」這個值,所以它的相對誤差比以前更大,雖然確切的(絕對)誤差是相同的。