以科学记数法对数字数组进行排序

Posted

技术标签:

【中文标题】以科学记数法对数字数组进行排序【英文标题】:Sort array of numbers in Scientific Notation 【发布时间】:2015-11-26 12:05:19 【问题描述】:

我想对一组数字(以科学计数法)从小到大进行排序。

这是我尝试过的(徒劳的):

require 'bigdecimal'
s = ['1.8e-101','1.3e-116', '0', '1.5e-5']
s.sort  |n| BigDecimal.new(n) .reverse

# Results Obtained
# => [ "1.3e-116", "1.8e-101", "0", "1.5e-5" ]

# Expected Results
# => [ "0", "1.3e-116", "1.8e-101", "1.5e-5"]

【问题讨论】:

【参考方案1】:

Enumerable#sort 的块预计会返回 -101。你要的是Enumerable#sort_by:

s.sort_by  |n| BigDecimal.new(n) 
# => ["0", "1.3e-116", "1.8e-101", "1.5e-5"]

【讨论】:

很好的文章来解释更多。 brandon.dimcheff.com/2009/11/18/rubys-sort-vs-sort-by.html 或者s.sort_by(&BigDecimal.method(:new)),如果你喜欢无点风格。【参考方案2】:

另一种选择是在sort 中使用BigDecimal#<=>

s.sort  |x, y| BigDecimal(x) <=> BigDecimal(y) 
#=> ["0", "1.3e-116", "1.8e-101", "1.5e-5"]

【讨论】:

以上是关于以科学记数法对数字数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章

Javascript科学记数法覆盖

Freemarker:将日期从科学记数法转换为数字

如何避免以科学记数法表示的双精度数和数字的字符串到数字转换?

订单编号复制到电子表格中为啥变成科计数法了

1024. 科学计数法 (20)

1024. 科学计数法 (20)