たとえば、次のような単純なものです。
public class WrongAnswer {
public static void main(String[] args) {
System.out.println(100*1.1);
}
}
110 の代わりに 110.00000000000001 を出力します。100*1.1 の代わりに他の数字を使用すると、多くの数字が得られ、末尾にランダムな数字が表示されますが、これは正しくありません。
何か案は?
たとえば、次のような単純なものです。
public class WrongAnswer {
public static void main(String[] args) {
System.out.println(100*1.1);
}
}
110 の代わりに 110.00000000000001 を出力します。100*1.1 の代わりに他の数字を使用すると、多くの数字が得られ、末尾にランダムな数字が表示されますが、これは正しくありません。
何か案は?
浮動小数点表記の精度には制限があります。ガイドは次のとおりです:http://floating-point-gui.de/
ほとんどの浮動小数点計算には、丸め誤差が含まれます。あなたの場合、2つの丸め誤差があります。(10進数の)1.1を浮動小数点に変換し(IEEE 754浮動小数点では1.1の正確な表現はありません。これは、Javaが使用するものです)、100を掛けます。優れた記事WhatEveryを参照してください。詳細については、コンピューター科学者は浮動小数点演算について知っておく必要があります。
In100*1.1
は1.1
修飾されていないため、デフォルトではdouble
while100
はデフォルトですint
。
したがって、乗算の結果もdouble
のアップキャストによるもので100
あり、それがこの結果を得る理由です。
答えたように、それは2倍になるため、形式になります。値を出力するには、関数を次のclosest int/long
ように使用することをお勧めします。Math.round()
System.out.println(Math.round(100*1.1));
これは、より正確な数値を乗算する場合に重要になります。
System.out.println(Math.round(100*1.199)); //--> prints 112
System.out.println((int)(100*1.199)); //--> prints 111