5

次のコードを実行すると、ある種の不明瞭な丸めエラーが発生するようです。

int roundedTotal = (int)(PriorityJob * 100.0);

最初はPriorityJob = 1.4androundedTotalは未定義です。PriorityJob * 100.0その時点で評価すると が得られ140ます。その後roundedTotal = 139

どうやら、140.0 は 139.99999 として解釈されています。これは浮動小数点エンジンの欠陥ですか? 私はそのようなものを見たことがありません。

4

1 に答える 1

10

最近のほぼすべてのコンピューターは、浮動小数点数にバイナリ表現を使用しています。

1/3 = 0.33333333...を小数として正確に表すことができないのと同様に(1/10したがって、 を含むほとんどの非整数 10 進数値は1.4) 2 進分数として正確に表すことはできません。代わりに、最も近い表現可能な値で表されます。これは、「真の」値よりわずかに大きいか小さい場合があります。

代わりに、最も近い整数に丸めることができます。(int)(PriorityJob * 100.0 + 0.5)

于 2012-09-14T12:52:41.590 に答える