【问题标题】:Why does ".sort()" in JavaScript sort incredibly small numbers as incredibly large numbers?为什么 JavaScript 中的“.sort()”会将非常小的数字排序为非常大的数字?
【发布时间】:2014-08-12 06:06:37
【问题描述】:

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

【问题讨论】:

标签: javascript sorting numbers


【解决方案1】:

您可能想要这样做:

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

这是因为(根据MDN)当没有提供排序功能时,它使用了一个 unicode 字符串比较器。

【讨论】:

    【解决方案2】:

    来自MDN Array.sort

    "默认排序顺序是根据字符串 Unicode 码位。"

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

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

    【讨论】:

      【解决方案3】:
      javascript 中的

      Array.sort() 不按 排序,而是进行 lexical 排序,这意味着它将数字视为字符串并以这种方式排序。这就是导致较长的 4e-20 排序高于较短且(在词汇上)较低的 3 的原因。

      虽然a - b 有效,但这是一个理论上更快的比较,因为它是无分支的:(a > b) - (a < b)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-08-21
        • 2023-02-16
        • 2022-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多