2016-12-19 39 views
3

我有一個舍入數字的問題。JavaScript圓形錯誤

x = 0.175; 
 
console.log(x.toFixed(2)); 
 
// RESULT: 0.17 
 

 
x = 1.175; 
 
console.log(x.toFixed(2)); 
 
// RESULT: 1.18 
 

 
x = 2.175; 
 
console.log(x.toFixed(2)); 
 
// RESULT: 2.17

爲什麼(X!= 1)0.175不四捨五入到十.18?

+2

我總是得到'* .18'的東西。 –

+5

嘗試'toFixed(20)',你會明白爲什麼。 – georg

+1

JavaScript糟糕的數字系統 – Mahi

回答

-3

JavaScript數字總是64位浮點數

不像許多其他的編程語言,JavaScript不定義不同類型的數字,如整數,短,長,浮點等

JavaScript的數字總是存儲爲雙精度浮點數,緊跟國際IEEE 754標準。

小數的最大數量爲17,但浮點運算並不總是100%準確:

0

這是這背後的原因...

擠壓無窮多的實數成有限的比特數需要近似表示。

雖然存在無限多的整數,但在大多數程序中,整數計算的結果可以存儲在32位中。相比之下,給定任意固定的位數,大多數使用實數的計算將產生無法用許多位精確表示的數量。因此,浮點計算的結果必須經過四捨五入以適應其有限表示。

x = 0.175; 
 
console.log(x.toFixed(20)); 
 
// RESULT: 0.17 
 

 
x = 1.175; 
 
console.log(x.toFixed(20)); 
 
// RESULT: 1.18 
 

 
x = 2.175; 
 
console.log(x.toFixed(20)); 
 
// RESULT: 2.17

此舍入誤差是浮點計算的特徵。

來源:http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

+2

你還沒有解釋過一件事 – j08691

+0

@ j08691沒錯,但他表現了什麼。 – JLRishe

+1

想要校對的人請閱讀http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html – Mahi

0

JavaScript有很多四捨五入的問題,這是二進制的機器試圖代表十進制的系統分數的結果。總是有不準確的地方。有時候,一個5被四捨五入,其他時候被四捨五入。它談到這些文章或主題:

http://www.jacklmoore.com/notes/rounding-in-javascript/

Avoiding problems with JavaScript's weird decimal calculations

How to deal with floating point number precision in JavaScript?

即使浮在JavaScript點表示不修復該問題的更精確的控制:

> x=2175e-3; x.toFixed(2); 
    "2.17" 
> x=1175e-3; x.toFixed(2); 
    "1.18" 

在獲得可預測結果非常重要的情況下,這些文章中至少有一篇建議使用「ε估計」技術,這實際上是微積分中幾個定義的核心。要知道這個解決方案可能比你談論的要多得多。

1

這裏的問題是0.175是二進制的重複小數(具體來說,在一個短前綴之後,它定義爲一個重複的0011模式)。當用有限浮點表示法表示時,此重複模式會被截斷。當您將整數部分從0更改爲1時,您將每次向數字的整數部分添加一個附加位,從而推出一個尾隨位。根據推出哪些位值,可能會更改四捨五入的值以影響可見結果。請注意,在2.175之後,四捨五入行爲的下一個改變直到8.175(在已經推出兩個低位比特之後)纔會發生。