Arrays 如果是最后一个小数点,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,

我把一个二进制字符串解码成一个浮点数组。我已经弄明白那部分了

现在,我必须获取该数组,并将其格式化为保留小数点后三位,不进行舍入。我所有的数字都是正确的,但不管出于什么原因,如果第三个小数位是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
零没有被“切断”,只是没有显示在输出中。如果您想要达到一定的精度,您需要要求:

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如何让您将数字格式化为字符串?(有太多的重复项…)所以我试着利用这个,但现在我的一些数字正在向上取整,我想要的是浮点数到小数点后第三位。它们必须取整,但取整方式取决于你。你有你正在处理的数字种类的例子吗?我只需要取数组中的每个数字,并在小数点后三位将其截断。有没有一种方法可以用字符串格式实现这一点?因为我不能对它们进行四舍五入。浮点数必须被视为近似值,这就是它们的行为方式,并且它们没有任何内在的格式。获取格式的唯一方法是将其转换为字符串,当这种情况发生时,您将不得不处理舍入,这是无法避免的。您可以选择一种适合您需求的舍入策略,如截断,如果这样更好的话。库中有很多方法可以处理这个问题。所以我尝试利用它,但现在我的一些数字正在向上取整,我想要的是浮点数到小数点后第三位。它们必须取整,但取整方式取决于您。你有你正在处理的数字种类的例子吗?我只需要取数组中的每个数字,并在小数点后三位将其截断。有没有一种方法可以用字符串格式实现这一点?因为我不能对它们进行四舍五入。浮点数必须被视为近似值,这就是它们的行为方式,并且它们没有任何内在的格式。获取格式的唯一方法是将其转换为字符串,当这种情况发生时,您将不得不处理舍入,这是无法避免的。您可以选择一种适合您需求的舍入策略,如截断,如果这样更好的话。库中有很多方法来处理这个问题。