このコードが 2.41 ではなく2.4099999999999997を出力するのはなぜですか
public class Main
{
public static void main(String args[])
{
double d = 5.55%3.14;
System.out.println(d);
}
}
このコードが 2.41 ではなく2.4099999999999997を出力するのはなぜですか
public class Main
{
public static void main(String args[])
{
double d = 5.55%3.14;
System.out.println(d);
}
}
問題はモジュロ演算子ではなく、浮動小数点数の性質です。double は 5.55、3.14、または 2.41 の正確な値を保持できないため、おおよその答えが得られます。
これをよりよく理解するために、紙に書くスペースが限られている場合は、1/3 の値を小数として書き留めてみてください。0.33333
実際の値の近似値である のような結果になります。5.55 を 2 進数で記述すると、同じことが起こります。double101.10001100110011001100110011...
のスペースに収まるように、どこかで切り捨てられます。
import java.text.DecimalFormat;
double d = 5.55%3.14;
DecimalFormat df = new DecimalFormat("#.##");
System.out.println( df.format( d ));
DecimalFormat を追加
編集:
あなたもすることができます
double d = 5.55%3.14;
System.out.printf("%1$.2f", d);
その理由は、Java が私たちのやり方で計算をしないからです。Java は 2 進数を使用します (Horstmann の大きな Java 本の第 4 章から) ので、コンピュータでは 435 = 4 * 10^2 + 3 * 10^1 + 5 * 10^0 となります。
これは、コンピューターのスイッチがオンまたはオフ (1 または 0) のいずれかであるため、2 進数 (1 または 0) の方が操作しやすいためです。
これにより、時折丸めの問題が発生します。強制的に丸めたい場合は、小数形式を使用するか、表示された値を丸める必要がある場合は、 String.format または printf を使用できます
Java double には精度の問題がある場合があります。
やってみませんBigDecimal
か?