6

コード:

class Main {
    public static void main (String[] args) {
        System.out.print("float: ");
        System.out.println(1.35f-0.00026f);
        System.out.print("double: ");
        System.out.println(1.35-0.00026);
    }
}

出力:

float: 1.34974
double: 1.3497400000000002

??? float は正しい答えを得ましたが、double はどこからともなく余分なものを追加しています。

double は float よりも正確であるはずではありませんか?

4

3 に答える 3

12

float は 4 バイト幅ですが、double は 8 バイト幅です。

すべてのコンピュータ科学者が浮動小数点演算について知っておくべきことを確認してください

確かに double の方が精度が高いため、丸め誤差がわずかに少なくなります。

無限に多くの実数を有限数のビットに圧縮するには、近似表現が必要です。無限に多くの整数がありますが、ほとんどのプログラムでは、整数計算の結果を 32 ビットで格納できます。対照的に、ビット数が固定されている場合、実数を使用したほとんどの計算では、その数のビットを使用して正確に表現できない量が生成されます。したがって、浮動小数点計算の結果は、その有限表現に適合させるために丸めなければならないことがよくあります。この丸め誤差が浮動小数点演算の特徴です。

補足:-

正確な小数値が必要な場合は、使用することをお勧めしますjava.math.BigDecimal

于 2013-10-18T07:36:04.217 に答える
3

Double.toString [Java-API]のドキュメントで指定されているdoubleを stringに変換するための規則について何か知っている場合は、プログラムが最も近い値から double 値を区別するのに十分な最短の小数を出力することを知っています。 、小数点の前後に少なくとも 1 桁ある。

Joshua Bloch のJava Puzzlers: Traps, Pitfalls, and Corner Cases - Puzzle 2: Time for a Change を確認してください。彼はその章でこの質問を説明しています。

于 2013-10-18T07:52:40.637 に答える
3

この理由は、浮動小数点計算による数値のメカニズムです。また、Java が float 値を出力しようとすると、末尾のゼロが切り捨てられます。そして、ご存知のとおり、double型は 8 バイト、floatは 4 バイトを使用します。したがって、倍精度はより大きくなります。

そのため、Java が float 値を計算すると、1.3497400 のような値が取得され、出力前に切り捨てられます。そして、Javaがdouble値を計算すると、桁数が増えるため、そのような結果が得られます。

理解を深めるために、次の簡単な例を実行してみてください。

public class Test {
    public static void main( String[] args ) {
        float sum = 0;
        for (int i = 1; i <= 10; i++) {
            sum += 0.1;
        }
        System.out.println( sum );
    }
}

public class Test {
    public static void main( String[] args ) {
        double sum = 0;
        for (int i = 1; i <= 10; i++) {
            sum += 0.1;
        }
        System.out.println( sum );
    }
}
于 2013-10-18T07:57:55.683 に答える