2013-03-08 78 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 )位,如果你不需要保持原来的顺序。