2017-09-05 44 views
-6

有沒有解決這個問題的方法?帶有數字10.435,10.425的小數點後兩位的JavaScript是特例嗎?

我不想使用if/else。

10.435.toFixed(2); => "10.43" //Wrong, should be '10.44' 
10.425.toFixed(2); => "10.42" //Wrong, should be '10.43' 
10.415.toFixed(2); => "10.42" 
10.445.toFixed(2); => "10.45" 

parseFloat(10.415).toFixed(2); => "10.42" //Wrong, should be '10.44' 
parseFloat(10.425).toFixed(2); => "10.42" //Wrong, should be '10.43' 
parseFloat(10.435).toFixed(2); => "10.43" 
parseFloat(10.415).toFixed(2); => "10.42" 

Math.round(10.435*100)/100 => 10.43 //Wrong, should be '10.44' 
Math.round(10.425*100)/100 => 10.42 //Wrong, should be '10.43' 
Math.round(10.415*100)/100 => 10.42 
Math.round(10.445*100)/100 => 10.45 
+0

這很奇怪。請將您的代碼發佈爲文本而不是圖片。 – informaton

+0

@informaton我將修改後的圖片編輯爲文本。請看看。謝謝 – Amera

+0

感謝您更新您的文章。我也得到了類似的行爲,儘管不是每種情況。我發佈了一個可能在下面幫助的解決方法。 – informaton

回答

0

你可以試試這個爲四捨五入一個正數,x一種變通方法,保留小數點後兩位。

Math.floor(x*100+0.5)/100); 

我能找到的舍入的預期值之間的行爲的最好理由是(#2)ECMA script standard的說明。

即使使用64位,也不可能表示所有內容;不過,我對這裏的舍入誤差感到有點驚訝。

一個更普遍的解決辦法,爲正數或負數是:

Math.floor(x*Math.pow(10,2)+Math.sign(x)*0.5)*Math.pow(10,-2)); 

,你可以改變2以適應所要四捨五入到小數位的數量。

相關問題