对包含3位小数的数组进行排序并保留尾随零(Ruby)

时间:2015-04-14 15:56:17

标签: ruby arrays floating-point-precision zero floating-point-conversion

我有一个包含以下数字的数组

numbers = [70.920, -38.797, 14.354, 99.323, 90.374, 7.581]

我想用数字对它们进行排序,但问题是ruby会自动使用尾随零来舍入数字。我想将格式保留为三位小数,并将尾随零忽略。

当我声明numbers数组时,我得到了这个输出。

=> [70.92, -38.797, 14.353, 99.323, 90.374, 7.581]

我试图将数组映射到包含3个小数位,然后将它们转换回浮点数。

number.map { |n| "%.3f" % n }.map(&:to_f).sort

Ruby再次修剪尾随的零。

[-38.797, 7.581, 14.354, 70.92, 90.374, 99.323]

我期待输入看起来像这样

[-38.797, 7.581, 14.354, 70.920, 90.374, 99.323]

我使用Float文档作为参考,但无法弄清楚如何实现这个

http://ruby-doc.org/core-2.2.0/Float.html

Ruby中有可能吗?提前谢谢。

2 个答案:

答案 0 :(得分:4)

不。您只能要求Ruby将数字格式化为字符串,而不是更改默认情况下显示它们的方式。也就是说,Ruby会以多种方式解释浮点数,但它会选择如何显示它们:

0x01.to_f # => 1.0
1_000e-3 # => 1.0
1.000 # => 1.0
1e0 # => 1.0
1.0 # => 1.0

因此,您必须依赖字符串表示格式:

numbers.sort.map { |n| "%.3f" % n }
# => ["-38.797", "7.581", "14.354", "70.920", "90.374", "99.323"]

当然,如果你正在打印,那么字符串和浮点数之间的区别通常是无关紧要的:

puts numbers.sort.map {|n| "%.3f" % n}
# -38.797
# 7.581
# 14.354
# 70.920
# ...

答案 1 :(得分:1)

您是否仅将输入表示与尾随零一起用于可视化目的?您可以使用该数组作为ruby使用它,删除尾随零。当您需要提供输入时,请使用以下内容:

numbers.sort.map{|n|sprintf "%.3f", n}