浮点数格式没有在ruby中舍入

时间:2016-01-26 05:56:44

标签: ruby floating-point format

有一个浮点数 def DogHome(request.GET): DogList = dog.objects.all() return render(request, 'DogHome.html', {'foo':DogList}) 。如何将其格式化为浮点后限制3位数?我尝试了num = 22.0098但是返回sprintf('%.3f',num),我需要22.010

3 个答案:

答案 0 :(得分:7)

我可以想到使用bigdecimal。不确定它是否过度杀伤:

require 'bigdecimal'   
BigDecimal::new("22.0098").truncate(3).to_f
#=> 22.009

答案 1 :(得分:2)

不幸的是,与Float#round不同,Float#floor不接受一定数量的数字。以下代码实现了所需的行为。

def floor_float input, digits = 3
  input.divmod(10 ** -digits).first / (10 ** digits).to_f  
end 

这可以用作猴子补丁:

class Float
  def floor_ext digits = 3
    self.divmod(10 ** -digits).first / (10 ** digits).to_f  
  end 
end
22.0098.floor_ext
#⇒ 22.009

可能是@Stefan建议的更简洁的变体:

class Float
  def floor_ext digits = 3
    div(10 ** -digits).fdiv(10 ** digits)
  end 
end
22.0098.floor_ext
#⇒ 22.009

或者,可以明确地处理字符串:

i, f = 22.0098.to_s.split('.')
#⇒ [ "22", "0098" ]
[i, f[0..2]].join('.')
#⇒ "22.009"

答案 2 :(得分:0)

如果您知道整数部分中有多少位数,您可以将其格式化为字符串:

sprintf("%.6s", num)
# => "22.009"

通常,您可以根据6的大小调整num