我正在使用二进制字符串并将其解码为浮点数组。我有那个部分想通了。
我现在必须使用该数组并将其格式化为剩下三个小数位,没有舍入。我的所有数字都是正确的,但无论出于何种原因,如果第三个小数位为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
答案 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