Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript Math.min返回错误的值_Javascript_Arrays_Min - Fatal编程技术网

JavaScript Math.min返回错误的值

JavaScript Math.min返回错误的值,javascript,arrays,min,Javascript,Arrays,Min,我使用查找数组中的最小值,但它以某种方式返回最小值。 这是一个密码 var arr = Math.min.apply(Math, [310127563311820800, 310127563190202368, 310127563110502401, 310127562443595776, 310127562326163457, 310127561751556097]); document.write(arr); 你能解释一下发生了什么以及为什么返回错误的(最低)值吗?问题不在于找到最小值,

我使用查找数组中的最小值,但它以某种方式返回最小值。 这是一个密码

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

你能解释一下发生了什么以及为什么返回错误的(最低)值吗?

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

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

有关更多详细信息,请参阅:

请注意,大小为no的所有正整数和负整数 大于253表示为数字类型(实际上是 整数0有两种表示形式,+0和-0)


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

除非输入数字字符串,否则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)位。

在数字超过该间隔的数组中,是否有其他方法可以找到最小值?