Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/363.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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中的“.sort()”会将非常小的数字排序为非常大的数字?_Javascript_Sorting_Numbers - Fatal编程技术网

为什么JavaScript中的“.sort()”会将非常小的数字排序为非常大的数字?

为什么JavaScript中的“.sort()”会将非常小的数字排序为非常大的数字?,javascript,sorting,numbers,Javascript,Sorting,Numbers,如果我运行[6,3,8,7,5,2,1,9,4,0]。排序,我将得到[0,1,2,3,4,5,6,7,8,9]作为您期望的输出。它将数字从最小到最大排序。但是如果我运行[2,3,1,4e-20]。排序,我得到[1,2,3,4e-20]作为输出。为什么.sort函数将4e-20视为大于3?即使您运行3>4e-20,您的输出也会为true,这表明JavaScript确实意识到4e-20是一个非常小的数字。但是排序函数将其视为一个难以置信的大数字。为什么会这样?有没有什么方法可以改变它,或者我只需要编

如果我运行[6,3,8,7,5,2,1,9,4,0]。排序,我将得到[0,1,2,3,4,5,6,7,8,9]作为您期望的输出。它将数字从最小到最大排序。但是如果我运行[2,3,1,4e-20]。排序,我得到[1,2,3,4e-20]作为输出。为什么.sort函数将4e-20视为大于3?即使您运行3>4e-20,您的输出也会为true,这表明JavaScript确实意识到4e-20是一个非常小的数字。但是排序函数将其视为一个难以置信的大数字。为什么会这样?有没有什么方法可以改变它,或者我只需要编写自己的函数

您可能需要执行以下操作:

[2, 3, 1, 4e-20].sort(function (a, b) {
    return a - b;
});

发生这种情况的原因是,根据未提供分类器功能的情况,它使用unicode字符串比较器。

您可能需要执行以下操作:

[2, 3, 1, 4e-20].sort(function (a, b) {
    return a - b;
});
发生这种情况的原因是,根据未提供分类器功能的情况,它使用unicode字符串比较器。

来自:

默认排序顺序根据字符串Unicode代码点

然后它继续比较数字而不是字符串,比较函数可以简单地从a中减去b。以下函数将对数组进行升序排序:

function compareNumbers(a, b) {
  return a - b;
}
发件人:

默认排序顺序根据字符串Unicode代码点

然后它继续比较数字而不是字符串,比较函数可以简单地从a中减去b。以下函数将对数组进行升序排序:

function compareNumbers(a, b) {
  return a - b;
}

javascript中的Array.sort不按<和>,而是按词法排序,这意味着它将数字视为字符串并按这种方式排序。这就是为什么较长的4e-20比较短且词汇较低的3排序更高的原因


虽然a-b可以工作,但从理论上讲,这是一个更快的比较,因为它是无分支的:a>b-a数组。javascript中的排序不是按<和>”排序,而是按词法排序,这意味着它将数字视为字符串并按这种方式排序。这就是为什么较长的4e-20比较短且词汇较低的3排序更高的原因


虽然a-b有效,但从理论上讲,这是一个更快的比较,因为它没有分支:a>b-a请仔细阅读这句话:即使运行3>4e-20,也会得到真的输出,这表明JavaScript确实意识到4e-20是一个难以置信的小数字。这一点的可能重复也适用于非整数,请仔细阅读这句话:即使你运行3>4e-20,你也会得到一个真实的输出,这表明JavaScript确实意识到4e-20是一个难以置信的小数字。这一点的可能重复也适用于非整数,