2015-01-21 58 views
2

我有百分比計算和舍入結果的以下問題。JavaScript中舍入問題

如果我使用Math.ceil

var total = 66666; 
var test1 = Math.ceil(60/100 * total); 
var test2 = Math.ceil(23.5/100 * total); 
var test3 = Math.ceil(14/100 * total); 
var test4 = Math.ceil(2.5/100 * total); 

然後test1 + test2 + test3 + test4 = 66664

如果我使用ParseInt

var total = 66666; 
var test1 = parseInt(60/100 * total); 
var test2 = parseInt(23.5/100 * total); 
var test3 = parseInt(14/100 * total); 
var test4 = parseInt(2.5/100 * total); 

然後test1 + test2 + test3 + test4 = 66668

我試圖從Python的重寫我的腳本爲Javascript和我ñPython我沒有這樣的問題。

+0

這是相反的:'Math.ceil'輪向上,所以你得到'66668'。 'parseInt'會轉換爲字符串,並將點之前的部分再次解析爲一個數字,就像'Math.trunc'一樣(但速度較慢),您會得到'66664'。 – Oriol 2015-01-21 10:04:24

+0

我不明白這個問題。如果你把你的數字四捨五入,這些會有一些錯誤。當你總結這些數字時,錯誤可以相互抵消,或者加起來。如果你不喜歡那樣,不要繞。 – Oriol 2015-01-21 10:09:54

+0

確實。你正在比較蘋果和橙子 - 「parseInt」與「Math.floor」將是一個更好的比較。這是[性能差異](http://jsperf.com/math-floor-vs-math-round-vs-parseint/55) – 2015-01-21 10:09:55

回答

7

如果你讀了doc如何parseInt工作你釋放問題的所在:

的parseInt函數()函數解析一個字符串參數並返回指定基數的 整數(數學數字 基地系統)。

語法

parseInt(string, radix); 

解析值。 如果字符串不是字符串,則將其轉換爲 一個。字符串中的空白字符將被忽略。

基數

表示上述字符串的基數(在 數學標記系統基座)2和36之間的整數。對於人類通常使用的十進制數字系統指定 10。總是 指定此參數以消除讀者的困惑並保證可預測的行爲。當未指定基數時,不同的實現產生不同的 結果。

說明

的parseInt函數函數將其第一個參數轉換爲字符串,解析 它,並返回一個整數或NaN

實施例:

parseInt(2.1) // returns 2 
parseInt(2.9) // returns 2 too 
parseInt('2.99') // returns 2 

另外建議將太傳遞基數作爲參數時呼叫parseInt

在javascript中最好使用的數字是Math.round()函數。

參考

Math.Round()

0

Javascript parseInt()函數接受一個字符串作爲它的參數,而Math.ceil()接受一個數字。正因爲如此,在parseInt線將解釋一個字符串,它看起來是這樣的:

parseInt(60/100 * total); 
// equivalent to: parseInt("39999.6") 

在這一過程中,他們將剝離小數並返回39999其中Math.ceil調用將返回40000。這是差異的原因。