sorting - Why does ".sort()" in JavaScript sort incredibly small numbers as incredibly large numbers? - Stack

If I were to run "[6,3,8,7,5,2,1,9,4,0].sort()" I get "[0,1,2,3,4,5,6,7,8,9]" as an

If I were to run "[6,3,8,7,5,2,1,9,4,0].sort()" I get "[0,1,2,3,4,5,6,7,8,9]" as an output like you would expect. It sorts the numbers from smallest to largest. But if I were to run "[2,3,1,4e-20].sort()" I get "[1,2,3,4e-20]" as an output. Why does the ".sort()" function treat "4e-20" as larger than "3"? Even if you run "3>4e-20" you get "true" as an output, showing that JavaScript does realize that "4e-20" is an incredibly tiny number. But the sort function treats it as an incredibly larger number. Why is this? and is there some way I can change it, or do I just have to write my own function?

If I were to run "[6,3,8,7,5,2,1,9,4,0].sort()" I get "[0,1,2,3,4,5,6,7,8,9]" as an output like you would expect. It sorts the numbers from smallest to largest. But if I were to run "[2,3,1,4e-20].sort()" I get "[1,2,3,4e-20]" as an output. Why does the ".sort()" function treat "4e-20" as larger than "3"? Even if you run "3>4e-20" you get "true" as an output, showing that JavaScript does realize that "4e-20" is an incredibly tiny number. But the sort function treats it as an incredibly larger number. Why is this? and is there some way I can change it, or do I just have to write my own function?

Share Improve this question edited Jun 21, 2014 at 19:15 user2864740 62.1k15 gold badges158 silver badges227 bronze badges asked Jun 21, 2014 at 19:05 user1432532user1432532 3491 gold badge5 silver badges14 bronze badges 3
  • Please read over this sentence carefully: "Even if you run "3>4e-20" you get "true" as an output, showing that JavaScript does realize that "4e-20" is an incredibly tiny number." – IMSoP Commented Jun 21, 2014 at 19:08
  • possible duplicate of arr.sort() does not sort integers correctly (this also applies to non-integer numbers) – user2864740 Commented Jun 21, 2014 at 19:13
  • stackoverflow./questions/7000851/… , stackoverflow./questions/1063007/… , stackoverflow./questions/11914665/… – user2864740 Commented Jun 21, 2014 at 19:14
Add a ment  | 

3 Answers 3

Reset to default 6

From MDN Array.sort:

"The default sort order is according to string Unicode code points."

It then goes on "[to] pare numbers instead of strings, the pare function can simply subtract b from a. The following function will sort the array ascending":

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

You might want to do this:

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

That happens because (according to MDN) when no sorter function is provided, it uses an unicode string parator.

Array.sort() in javascript does not sort by < and >, it instead does a lexical sort, which means it treats the numbers as strings and sorts them that way. This is what causes the longer 4e-20 to be sorted higher than the shorter and (lexically) lower 3.

While a - b works, this is a theoretically faster parison because it is branchless: (a > b) - (a < b)

发布者:admin,转转请注明出处:http://www.yc00.com/questions/1744223093a4563878.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信