3

我正在使用John Resig 的函数来查找数组中的最小值,但它以某种方式返回了底值。这是一个演示,这是代码。

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

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

4

2 回答 2

4

问题不在于找到最小值,而在于使用这些数字。您不能在 JavaScript 中将它们表示为数字,因为整数只能完全保持在-9007199254740992和之间+9007199254740992

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

请参阅ECMAScript 规范中有关数字类型的更多详细信息:

请注意,所有大小不大于 253 的正整数和负整数都可以用 Number 类型表示(实际上,整数 0 有两种表示形式,+0 和 -0)。

要处理这些数字(并找到它们的最小值),您需要使用原生 JavaScript 数字之外的另一种表示形式。希望有许多处理大数字的库,例如bignum(但您应该 google 并选择您喜欢的那个)。

于 2013-03-08T21:20:34.917 回答
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) 位。

于 2013-03-09T01:44:08.867 回答