Ruby如果是最后一个小数,则截止0小数

时间:2016-03-14 17:58:09

标签: arrays ruby parsing floating-point

我正在使用二进制字符串并将其解码为浮点数组。我有那个部分想通了。

我现在必须使用该数组并将其格式化为剩下三个小数位,没有舍入。我的所有数字都是正确的,但无论出于何种原因,如果第三个小数位为0,那么Ruby会将其删除,我需要包含0。

例如:

预期:

3.480

我的输出:

3.48

如何将浮点数截断为三位小数,如果该数字以0结尾,如何保持该零点不被截断?

f.each_line do |line|
  if first
    first = false
  else
    a, b, c = line.chop.split(',')
    # puts a,b,c
    ay = Base64.decode64(c)
    ay = ay.unpack('f*')
    ay.each do |x|
      temp = ((x * 1000).floor / 1000.0) #error occurs here
      puts temp
      o.write(temp.to_s + ',')
    end
  end

end

f.close

2 个答案:

答案 0 :(得分:2)

零没有“切断”,它只是没有显示在输出中。如果你想要一定程度的精确度,你需要提出它:

o.write(ay.collect { |v| '%.3f' % v }.join(','))

一次性处理舍入和呈现。如果您只想要四舍五入,则应使用round函数:

v.round(3)

请记住,在内部,您的浮点数以二进制形式存储,因此没有2.30这样的东西。内部可能是2.29999999998371923891,但在以字符串形式显示时会被清理。

答案 1 :(得分:1)

根据您的评论,如果您希望将您的号码截断(不舍入)到三位小数,那么:

n = 3.14159265358979
puts "%.3f" % ((n*1000).floor / 1000.0)
#=> 3.141

这是做什么的:

n*1000                     # 3141.59265358979
(n*1000).truncate          # 3141
(n*1000).truncate / 1000.0 # 3.141

然后我使用"%.3f" formatting% method来确保显示正好三个小数位(即使其中一些是尾随零)。

如果您经常使用它,或者需要一般性地使用它:

class Numeric
  def truncate_to( digits=0 )
    factor = 10.0**digits
    "%.#{digits}f" % ((self*factor).truncate / factor)
  end
end

puts [ 3.14159, 1, -1.9999 ].map{ |n| n.truncate_to(3) }
#=> 3.141
#=> 1.000
#=> -1.999