【发布时间】:2014-10-09 00:29:21
【问题描述】:
为什么在使用 '%.3f' % string.to_float 或包括 sprintf、Kernel.format 在内的任何变体时,string.to_float 值的数组可以正确排序,但这些相同的值排序不正确?
我该如何纠正这个问题?
我目前正在处理一项挑战,它会为您提供一个文本文件,其中包含用数字填充的行(示例):
1.123 -3.010 3.999 -2.199 -1.212 2.190 4.121 0.000
我的目标是对这些数字进行排序,并按照它们的显示将它们打印到控制台。
我的第一次尝试是首先将这些行拆分为各自的字符串编号,然后使用 .to_f 将它们转换为浮点值,最后对它们进行排序并将它们重新连接在一起(空格分隔)。
看起来像这样:
line.chomp.split(" ").map { |e| e.to_f }.sort!.join(" ")
这很有效,直到我意识到任何以小数点后三位精度结尾的数字(例如 68.060)都会丢失最后一个零。因此显示为 68.06 而不是 68.060,这会使解决方案无效。
我四处走走,果然找到了很多参考资料:
Kernel.format('%.3f', num)
和
sprintf '%.3f' % num
这些都很完美,他们解决了问题。我这样应用它们(尝试了变化,但它们都做了同样的事情):
line.chomp.split(" ").map { |e| sprintf '%.3f', e }.sort!.join(" ")
然后我发现自己正在寻找另一个问题。放入控制台的每一行现在都将负数组织起来,就好像它们是正数一样,所以不是:
-3.010 -2.199 -1.212 0.000 1.123 2.190 3.999 4.121
在控制台上,我看到了:
-1.212 -2.199 -3.010 0.000 1.123 2.19 3.999 4.121
这个我找不到太多。这可能是我的错,因为我不知道在谷歌上放什么,但我的搜索都没有找到任何相关的东西。
【问题讨论】:
标签: ruby arrays sorting printf floating-point-precision