Arrays 如果是最后一个小数点,Ruby将截断0个小数点
我把一个二进制字符串解码成一个浮点数组。我已经弄明白那部分了 现在,我必须获取该数组,并将其格式化为保留小数点后三位,不进行舍入。我所有的数字都是正确的,但不管出于什么原因,如果第三个小数位是0,那么Ruby会将其截断,我需要包含这些0 例如: 预期:Arrays 如果是最后一个小数点,Ruby将截断0个小数点,arrays,ruby,parsing,floating-point,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,
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
零没有被“切断”,只是没有显示在输出中。如果您想要达到一定的精度,您需要要求:
o.write(ay.collect { |v| '%.3f' % v }.join(','))
这可以一次性处理舍入和表示。如果您只想取整,则应使用以下功能:
v.round(3)
请记住,在内部,浮点数是以二进制形式存储的,因此不存在2.30之类的东西。在内部,它可能是2.29999998371923891,但当作为字符串显示时,它会被清除。零不会被“截断”,只是不会显示在输出中。如果您想要达到一定的精度,您需要要求:
o.write(ay.collect { |v| '%.3f' % v }.join(','))
这可以一次性处理舍入和表示。如果您只想取整,则应使用以下功能:
v.round(3)
请记住,在内部,浮点数是以二进制形式存储的,因此不存在2.30之类的东西。在内部,可能是2.2999999998371923891,但当显示为字符串时,该值会被清除。根据您的评论,如果您希望将数字截断(而不是四舍五入)到小数点后三位,则:
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
然后,我使用和确保正好显示三位小数(即使其中一些是尾随的零)
如果您经常使用,或需要一般使用:
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
根据您的评论,如果您希望将数字截断(而不是四舍五入)到小数点后三位,则:
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
然后,我使用和确保正好显示三位小数(即使其中一些是尾随的零)
如果您经常使用,或需要一般使用:
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
数字没有尾随零:尾随十进制0不会更改值。表示它们的文本可能会-Ruby如何让您将数字格式化为字符串?(有太多重复项..)数字没有尾随零:尾随十进制0不会更改值。表示它们的文本可能会-Ruby如何让您将数字格式化为字符串?(有太多的重复项…)所以我试着利用这个,但现在我的一些数字正在向上取整,我想要的是浮点数到小数点后第三位。它们必须取整,但取整方式取决于你。你有你正在处理的数字种类的例子吗?我只需要取数组中的每个数字,并在小数点后三位将其截断。有没有一种方法可以用字符串格式实现这一点?因为我不能对它们进行四舍五入。浮点数必须被视为近似值,这就是它们的行为方式,并且它们没有任何内在的格式。获取格式的唯一方法是将其转换为字符串,当这种情况发生时,您将不得不处理舍入,这是无法避免的。您可以选择一种适合您需求的舍入策略,如截断,如果这样更好的话。库中有很多方法可以处理这个问题。所以我尝试利用它,但现在我的一些数字正在向上取整,我想要的是浮点数到小数点后第三位。它们必须取整,但取整方式取决于您。你有你正在处理的数字种类的例子吗?我只需要取数组中的每个数字,并在小数点后三位将其截断。有没有一种方法可以用字符串格式实现这一点?因为我不能对它们进行四舍五入。浮点数必须被视为近似值,这就是它们的行为方式,并且它们没有任何内在的格式。获取格式的唯一方法是将其转换为字符串,当这种情况发生时,您将不得不处理舍入,这是无法避免的。您可以选择一种适合您需求的舍入策略,如截断,如果这样更好的话。库中有很多方法来处理这个问题。