次のコードを実行してみました。
double f = 4.35;
int n = (int) (100 * f);
n
となります434
。なんで?
.35 は 2 の (負の) 累乗ではないため、4.35 を浮動小数点数として正確に表すことはできません。その結果、多少の丸めが発生します。100 を掛けると、おそらく四捨五入も行われます。結果の数値が 435 より少し小さい場合、int へのキャストはその最小値である 434 を使用します。
NEAREST 整数に丸めたい場合は、結果に 0.5 を追加してから int にキャストできます。これは数値を丸める最も一般的な方法ですが、Java には丸めの実装が組み込まれています。
double f = 4.35;
int n = (int) (100 * f + 0.5);
これを見る必要があります。大学1年生の宿題に視聴させました。http://vimeo.com/7403673 - ジョン・スキートとトニー・ザ・ポニー。
London Stack Overflow DevDays イベントでの Jon Skeet のプレゼンテーション: stackoverflow.carsonified.com
6:50 あたりで、彼は Java の数学と、数学に関して開発者が直面する一般的な問題のいくつかについて話します。
代わりにこれを試してください:
double f = 4.35;
int n = (int) Math.round(100 * f);
n
期待どおり、 as value になります435
。この種の問題は、基数 2 で表される 10 進数値を処理する際の丸め誤差が原因で発生します。詳細については、次のリファレンスを参照してください: What Every Computer Scientist Should Know About Floating-Point Arithmetic .
これは、浮動小数点数が基数 10 ではなく基数 2 で内部的に表されるためです。
これが役立ちます(インポートする必要がありますMath
):
double f = 4.35;
long n = Math.round(100 * f);