2013-03-08 45 views
3

我使用John Resig's function來查找數組中的最小值,但它返回某種方式的floored值。 這裏有一個demo這裏是代碼。JavaScript Math.min返回錯誤的值

var arr = Math.min.apply(Math, [310127563311820800, 310127563190202368, 310127563110502401, 310127562443595776, 310127562326163457, 310127561751556097]); 
document.write(arr); 

你能解釋我會發生什麼,爲什麼它會返回錯誤的(floored)值?

回答

4

問題不在於找到最小值,而是使用這些值。您無法將它們表示爲JavaScript中的數字,因爲整數只能完全保留在-9007199254740992+9007199254740992之間。

這是因爲在JavaScript所有的數字都是雙精度IEEE754浮標和尾數的大小是53

ECMAScript specification on the number type更多的細節:

注意,所有的正,負整數,它的大小是不是 大於253可用Number類型表示(實際上, 整數0有兩個表示,+0和-0)。

要處理這些數字(並找到它們的最小值),您需要使用除本機JavaScript數字之外的其他表示。希望有很多圖書館處理大數字,例如bignum(但你應該谷歌和挑選你喜歡的)。

+0

是否有另一種方法來查找數字超過該間隔的數組中的最小值? – lam3r4370 2013-03-08 21:24:32

1

除非您輸入字符串的數字,否則您將失去javascript精度。

如果他們都是正整數,你可以對它們進行排序,並返回最低索引的元素,記住更多的數字組成的字符串必須比一個有fewer-

var input= ['310127563311820800', '310127563190202368', '310127563110502401', 
'310127562443595776', '310127562326163457', '310127561751556097']; 


var minim= input.slice(0).sort(function(a, b){ 
    if(a=== b) return 0; 
    if(a.length!= b.length) return a.length-b.length; 
    return a>b? 1:-1; 
})[0]; 

alert(minim); 

/* returned value: (String) 
310127561751556097 
*/ 

可以跳過片大(0 )位,如果你不需要保持原來的順序。