web-dev-qa-db-ja.com

to_dは、rubyの小数点以下2桁を常に返す

通貨を扱っていますが、数値を小数点以下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
47
ed1t

Mcfinniganの答えに加えて、次を使用して小数点以下2桁を取得することもできます

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

この使用例は string format operator として知られています

91
jvnill

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"
38
Stefan

ここにヒントがあります。 500.00は数値500.0の表現です

具体的には、sprintfが役立ちます。

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

お金を表すために浮動小数点数を使用しないでください。これが悪い考えである理由の概要については この質問 を参照してください。

代わりに、通貨値を整数(セントを表す)として保存するか、 money gemを見て、そのような値を処理するための多くの便利な機能を提供してください。

11
Lars Haugseth

切り捨てる必要がありました。

他のほとんどの回答は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"
2
webaholik