我正在使用John Resig's function在数组中查找min值,但它会以某种方式返回floored值。 这是一个demo,这是代码。
var arr = Math.min.apply(Math, [310127563311820800, 310127563190202368, 310127563110502401, 310127562443595776, 310127562326163457, 310127561751556097]);
document.write(arr);
你能解释一下发生了什么以及它为什么会返回错误(无效)值?
答案 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)位。