63

我正在处理货币,我想将数字四舍五入到小数点后 2 位。即使数字是 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
4

5 回答 5

123

除了 mcfinnigan 的答案,您还可以使用以下方法获得小数点后 2 位

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

此用例称为字符串格式运算符

于 2013-04-09T11:30:20.307 回答
59

由于您使用的是 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"
于 2013-04-09T11:36:30.427 回答
36

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

具体来说,sprintf 将帮助您:

irb(main):004:0> sprintf "%.2f", 500.0
=> "500.00"
于 2013-04-09T11:27:01.353 回答
13

不要使用浮点数来表示金钱。请参阅此问题,以全面了解为什么这是一个坏主意。

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

于 2013-04-09T11:36:13.197 回答
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"
于 2018-10-15T01:42:36.713 回答