0

このコードが 2.41 ではなく2.4099999999999997を出力するのはなぜですか

public class Main
{
    public static void main(String args[])
    {
        double d = 5.55%3.14;
        System.out.println(d);
    }
}
4

4 に答える 4

3

問題はモジュロ演算子ではなく、浮動小数点数の性質です。double は 5.55、3.14、または 2.41 の正確な値を保持できないため、おおよその答えが得られます。

これをよりよく理解するために、紙に書くスペースが限られている場合は、1/3 の値を小数として書き留めてみてください。0.33333実際の値の近似値である のような結果になります。5.55 を 2 進数で記述すると、同じことが起こります。double101.10001100110011001100110011...のスペースに収まるように、どこかで切り捨てられます。

于 2013-02-22T19:00:24.037 に答える
2
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);
于 2013-02-22T18:54:28.333 に答える
1

その理由は、Java が私たちのやり方で計算をしないからです。Java は 2 進数を使用します (Horstmann の大きな Java 本の第 4 章から) ので、コンピュータでは 435 = 4 * 10^2 + 3 * 10^1 + 5 * 10^0 となります。

これは、コンピューターのスイッチがオンまたはオフ (1 または 0) のいずれかであるため、2 進数 (1 または 0) の方が操作しやすいためです。

これにより、時折丸めの問題が発生します。強制的に丸めたい場合は、小数形式を使用するか、表示された値を丸める必要がある場合は、 String.format または printf を使用できます

于 2013-02-22T19:04:48.040 に答える
1

Java double には精度の問題がある場合があります。

やってみませんBigDecimalか?

于 2013-02-22T18:49:57.293 に答える