0

私は小数点以下2桁を維持しようとしています。私は次のような数字を持っています:

9.96999.to_f.round(2)

ほとんどの場合、小数点以下 2 桁 ( 9.97) に丸められますが、次のような結果が得られることがあります。

9.96999999999

理由はありますか?

編集

スクレイピングされたテーブルから 2 つの値を追加しています。表を見ると、これが発生しているのは、セル 19.02の値が でセル 2 の値が である0.95場合、またはセル 19.87の値が でセル 2 の値が である場合のみ0.1です。どちらの場合も、明らかに を取得する必要があります9.97。代わりに、正確に取得しています9.969999999999999。すべての初期値は文字列として始まります。

4

3 に答える 3

2

浮動小数点値は本質的に不正確です。多くの正確な小数の正確な表現はありません。それでも、入力ではなく計算の結果に対してラウンドを実行した方が、ラウンドはうまく機能します。

ほとんどの場合、ラウンドはまったく必要なく、単にプレゼンテーションを制御したいだけです。その場合はKernel#sprintf、またはを使用しますString#%

pry(main)> f = (9.02 + 0.95)
=> 9.969999999999999
pry(main)> '%.2f' % f
=> "9.97"
pry(main)> 9.02.round(2) + 0.95.round(2)
=> 9.969999999999999
pry(main)> f.round(2)
=> 9.97

浮動小数点表現と算術演算について根本的な誤解があるようです。悩む前に読んでおくことをお勧めします。ここから始めてください:すべてのコンピューター科学者が浮動小数点演算について知っておくべきこと

于 2013-03-22T21:10:01.913 に答える
-1

.to_f.round() を使用しないでください これを使用してください: A.round(2) -> anInteger

A を最も近い整数に丸めます。(それと同じくらい簡単です)

于 2013-03-22T19:47:22.737 に答える