JavaScript数学.最小返回错误的值

JavaScript Math.min returns wrong value

本文关键字:错误 返回 数学 JavaScript      更新时间:2023-09-26

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

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

你能解释一下发生了什么,为什么它返回错误的(地板)值?

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

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

参见ECMAScript规范中关于数字类型的更多细节:

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

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

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

如果不需要保持原始顺序,可以跳过切片(0)位。