to_d总是在ruby中返回2个小数位

时间:2013-04-09 11:23:18

标签: ruby-on-rails ruby math decimal

我正在处理货币,我想将数字四舍五入到小数点后两位。即使数字是500.0,我希望它是500.00才能保持一致。当我执行“500.00”.to_d时,它将其转换为500.0。

改变这种行为的好方法是什么?我也使用这种方法向下舍入到2位数,并确保它总是有2位小数。

def self.round_down(x, n=2)
    s = x.to_s      
    l = s.index('.') ? s.index('.') + 1 + n : s.length
    s = s[0, l]
    s =  s.index('.') ? s.length - (s.index('.') + 1) == 1 ? s << '0' : s : s << '.00'      
    s.to_f
end

5 个答案:

答案 0 :(得分:87)

除了mcfinnigan的回答,您还可以使用以下内容获得2位小数

'%.2f' % 500 # "500.00"

此用例称为string format operator

答案 1 :(得分:38)

由于您使用的是Rails,这似乎与视图有关,因此number_with_precision

number_with_precision(500, precision: 2)
#=> "500.00"

I18n.locale = :de
number_with_precision(500, precision: 2)
#=> "500,00"

对于我建议number_to_currency的货币:

number_to_currency(500)
#=> "$500.00"

答案 2 :(得分:29)

这是一个提示。 500.00表示数字500.0

具体来说,sprintf会帮助你:

irb(main):004:0> sprintf "%.2f", 500.0
=> "500.00"

答案 3 :(得分:11)

不要使用浮点数来代表金钱。请参阅this question,了解为什么这是一个糟糕的主意。

相反,将货币值存储为整数(代表美分),或者查看money gem,它提供了许多有用的功能来处理这些值。

答案 4 :(得分:2)

有四舍五入的要求。

大多数其他答案从500.016上升到500.02

尝试:

def self.round_down(x, n = 2)
  "%.#{n}f" % x.to_d.truncate(n)
end

irb(main):024:0> x=500.0; '%.2f' % x.to_d.truncate(2)
=> "500.00"
irb(main):025:0> x=500.016; '%.2f' % x.to_d.truncate(2)
=> "500.01"