为什么JavaScript中的“.sort()”会将非常小的数字排序为非常大的数字?
如果我运行[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是一个非常小的数字。但是排序函数将其视为一个难以置信的大数字。为什么会这样?有没有什么方法可以改变它,或者我只需要编写自己的函数 您可能需要执行以下操作:为什么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是一个非常小的数字。但是排序函数将其视为一个难以置信的大数字。为什么会这样?有没有什么方法可以改变它,或者我只需要编
[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是一个难以置信的小数字。这一点的可能重复也适用于非整数,