2

このコードに問題があります!Javaでコードを実行しようとしていますが、答えはかなり奇妙に思えます。

float a=0.1F;
float b=0.2F;
if((a+b)==0.3){
System.out.println("True");
}
else{
System.out.println("False");
}

答えは : False ですが、理論的には True を返す必要があります。0.15 と 0.15 または 0.05 と 0.25 のように a と b の値を使用すると、関数は True を返します。私は混乱しています。Java/JavaScript などの言語が IEEE-754 数値フォーマットを実装していることをどこかで読んだことがあります。もしそうなら、このフォーマットは何ですか?コードの何が問題なのですか? とにかく数値形式を変更する方法はありますか?

4

5 に答える 5

5

a+bfloat( )とdouble( )の精度の違い0.3により、条件がfalseになっています。代わりにを使用できます(a+b)==0.3F。すなわち

float a = 0.1F;
float b = 0.2F;
if ((a + b) == 0.3F) {  // notice the "F"
    System.out.println("True");
} else {
    System.out.println("False");
}

編集:この場合、doublesを使用しても条件は次のようになりますfalse

double a = 0.1;
double b = 0.2;
if ((a + b) == 0.3) {
    System.out.println("True");
} else {
    System.out.println("False");
}
誤り

印刷0.1 + 0.2すると、その理由が明らかになります(数値を完全に表すことはできません)。

0.30000000000000004
于 2012-11-24T17:36:39.173 に答える
1

(a + b)はフロートですが、0.3はdoubleです。同じタイプと比較する必要があります。

if ((a + b) == 0.3F) {
于 2012-11-24T17:36:52.630 に答える
1

数値の末尾にfを追加するだけで、コンパイラーはadoubleとaを区別できfloatます。

float a=0.1F;
float b=0.2F;
if((a+b)==0.3f){
System.out.println("True");
}
else{
System.out.println("False");
}

アップデート:

この同様の質問も参照してください。

ベストアンサーは、以下を使用してloatewualityをチェックする必要があると述べています。

if(Math.abs((a+b) - 0.3F) < epsilon)

ここで、イプシロンは、必要な精度に応じて、0.00000001のような非常に小さい数値です。

于 2012-11-24T17:37:00.247 に答える
1

Float/Double を == 記号と比較しないでください。

数字の後に「f」を付けても、これは機能しませんでした。ここでの問題はフォーマットではなく、データの損失です。10 塩基を 2 塩基に変換すると条件が false になる可能性があるため、データの損失が発生します。

于 2012-11-24T17:47:00.343 に答える
0
float a=0.1F;
float b=0.2F;
if((a+b)==0.3){
System.out.println("True");
}
else{
System.out.println("False");
}

.3 デフォルトでは double 型です。.3 と表示されますが、コンピューターの場合、正確な値は .2999998 です...何か。したがって、違い。

コンパイラに .3 が float であることを明示的に伝えると、アナロジーが保持されます。

そう

float a=0.1F;
float b=0.2F;
if((a+b)==0.3F){
System.out.println("True");
}
else{
System.out.println("False");
}

このスレッドに従って、「二重」問題への渇望を満たしてください

于 2012-11-24T17:42:30.940 に答える