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

ed1*_*d1t 48 ruby math currency ruby-on-rails decimal

我正在处理货币,我想将数字向下舍入到小数点后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
Run Code Online (Sandbox Code Playgroud)

jvn*_*ill 97

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

'%.2f' % 500 # "500.00"
Run Code Online (Sandbox Code Playgroud)

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

  • 注意:这将向下或向上舍入,例如。500.016 变为 500.02 (2认同)
  • 是的,预期行为将遵循四舍五入规则 (2认同)

Ste*_*fan 40

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

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

I18n.locale = :de
number_with_precision(500, precision: 2)
#=> "500,00"
Run Code Online (Sandbox Code Playgroud)

对于我建议的货币number_to_currency:

number_to_currency(500)
#=> "$500.00"
Run Code Online (Sandbox Code Playgroud)


mcf*_*gan 30

这是一个提示.500.00是数字500.0的代表

具体来说,sprintf将帮助您:

irb(main):004:0> sprintf "%.2f", 500.0
=> "500.00"
Run Code Online (Sandbox Code Playgroud)

  • 正如谚语所说,真正的程序员可以用***语言编写C语言!`'%.2f'%500`是Ruby的习语. (10认同)
  • @CamilleGoudeseune我把它归咎于Java太多年了:/ (3认同)

Lar*_*eth 12

不要使用浮点数来代表金钱.请参阅此问题,以便更好地了解为什么这是一个坏主意.

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