JavaScript Math.min返回错误的值

时间:2013-03-08 21:18:59

标签: javascript arrays min

我正在使用John Resig's function在数组中查找min值,但它会以某种方式返回floored值。 这是一个demo,这是代码。

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

你能解释一下发生了什么以及它为什么会返回错误(无效)值?

2 个答案:

答案 0 :(得分:4)

问题不在于找到min而是在使用这些数字。您无法在JavaScript中将它们表示为数字,因为整数只能完全保留在-9007199254740992+9007199254740992之间。

这是因为JavaScript中的所有数字都是双精度IEEE754浮点数,尾数的大小是53。

ECMAScript specification on the number type中查看更多详情:

  

注意所有正数和负数的整数,其大小为否   在数字类型中可以表示大于253(实际上是   整数0有两个表示,+ 0和-0)。

要处理这些数字(并找到它们的最小值),您需要使用除本机JavaScript编号之外的其他表示。希望有很多图书馆处理大数字,例如bignum(但你应该谷歌并选择你喜欢的那个)。

答案 1 :(得分:1)

除非您输入字符串数字,否则您将失去javascript的精确度。

如果它们都是正整数,你可以对它们进行排序并返回最低的索引元素,记住一个包含更多数字的字符串必须大于一个更少的数字 -

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
*/

如果您不需要保留原始顺序,可以跳过slice(0)位。