ここには単純なコードがありますが、除算や複雑な乗算はありません。
for ( double i=.1; i<=1; i+=.1) {
System.out.println(i);
}
しかし、や など、 の値がi
正確でない場合もあります。.79999999
.600000001
なぜこれが起こったのですか?このコードを正確に変更するにはどうすればよいですか?
ここには単純なコードがありますが、除算や複雑な乗算はありません。
for ( double i=.1; i<=1; i+=.1) {
System.out.println(i);
}
しかし、や など、 の値がi
正確でない場合もあります。.79999999
.600000001
なぜこれが起こったのですか?このコードを正確に変更するにはどうすればよいですか?
ループ内で使用int
すると、問題が解決します。
for (int i=1;i<=10;i++) {
System.out.println(i*0.1);
}
これは、小数が精度を失う可能性があり、正確に表現されていないために発生しています。詳細については、すべてのコンピューター科学者が浮動小数点演算について知っておくべきこと
を知りたい場合があります。
これは のよく知られた性質ですdouble
。
double は、0.x * 2^y (または 1.x * 2^x) の形式で数値を格納します。
これは、すべての整数を正確に表現できるわけで
はなく、最も重要なことに、すべての小数を正確に表現できるわけではないことを意味します。
ここのようなものを使用する必要があると思いBigDecimal
ます。
これは、浮動小数点演算によるものです。正確な値が必要な場合は、次のような特別なクラスがありますBigDecimal