2012-01-15 13 views
0

変数を浮動小数点として初期化しようとしていて、それをタイムループで追加しようとしています。ここに私のコードだ:プリミティブをどのように初期化して追加するのですか?

amt = 0.0 

5.times do 
    amt = amt + ("%.2f" % (item.price * 0.05)) 
end 

ここでエラーです:

String can't be coerced into Float 

EDIT:

私は1.times doを変更しました。私は自分のコードをより読みやすくするように修正しましたが、1.timesは私の実際のコードではありませんでした。

+0

それはおそらくです(item.price * 0.05)によって:BigDecimalのを使用するには

は、あなたがしたいことはある、

次に、あなたのapplication.rbに 'BigDecimalを' を必要と"%.2f"、あなたは何をしようとしていますか? –

+0

私はsprintfスタイルのものを想定しています。 –

+1

'1×do'?何? – Linuxios

答えて

1

まず、浮動小数点演算を使用しないでください。この場合は、BigDecimalを使用する必要があります。浮動小数点演算は正確ではありません。あなたはMODにしようとしているため

amt = BigDecimal.new("0") 

1.times do 
    price = BigDecimal.new(item.price.to_s) 
    factor = BigDecimal.new("0.05") 
    amt += (price * factor).round(2) 
end 

amt 
+2

またはすべてのものをセントとして扱い、100で割ってドルの金額を取得します。 –

+0

ありがとうございます。私はBigDecimalについて知らなかった。 – varatis

0

ごめんなさい。私はRubyを初めて使っているので、これが問題だとは知らなかったが、 "%.2f"が問題を引き起こしていた。 (この質問とは無関係ですが、これは何かを小数点以下2桁に変換するものです)。愚かな間違い!

+1

しかし、なぜそれを追加しないのですか?それを何かに変換する理由はありません。そして1倍のものは何かから残っていたのですか?それはちょっと変だ。 –

+0

@DaveNewton問題文を簡略化していました。実際のループにはもっと複雑なRails構文があります。単純化して、Rubyの知識だけで答えられるようにしたかったのです。 – varatis

+0

ええと、私はループをすべて一緒に残してしまったかもしれません。なぜならそれは本当に質問の一部ではないからです。しかし、それは "2小数精度"に変換されません。途中で書式を設定して問題を引き起こします。 –

関連する問題