5 Stimmen

Erläuterung der Ausgabe eines Java-Programms

Ich bin auf das folgende Programm gestoßen

class Boolean {  
  public static void main(String argv[]) {  
    boolean x;  
    x = 4.4f == 4.4;  
    System.out.println(x);  
  }  
} 

Die Ausgabe des folgenden Programms lautet false

Wenn wir das Programm jedoch auf folgende Weise schreiben, dann

class Boolean {  
    public static void main(String argv[]) {  
      boolean x;  
      x = 4.5f == 4.5;  
      System.out.println(x);  
    }  
}

In diesem Fall lautet die Ausgabe true

Kann mir jemand erklären, warum?

3voto

Krns Punkte 178

Im Allgemeinen sollten Sie Fließkommazahlen nicht mit dem Operator == vergleichen. Sie sollten einen Vergleich verwenden, der "nahe genug" ist, d.h. Sie sollten prüfen, ob sich die Werte um einen kleinen Wert unterscheiden:

double epsilon = 0.000001

boolean equal = Math.abs(value1-value2) < epsilon

In Ihrem Beispiel ist 4.4f nicht gleich 4.4, weil Java Fließkommawerte standardmäßig auf doppelt Typ, der 64bit ist, und um sie zu vergleichen, wandelt Java 4.4f in double um, was dazu führt, dass der Wert leicht vom ursprünglichen double-Wert 4.4 abweicht (wegen der Probleme bei der Darstellung von Dezimalbrüchen mit Binärwerten).

Hier ist eine gute リンク auf Gleitkommazahlen.

1voto

Das Problem ist, dass Computer Zahlen gerne zur Basis 2 und nicht wie wir zur Basis 10 nehmen.

4,4 ist ein unendlicher Bruch (wie 0,333333333... für uns) im Binärsystem, und Gleitkommazahlen haben weniger Ziffern als Doppelzahlen, so dass 4,4f weniger Ziffern hat als 4,4, was sie unterschiedlich macht.

4,5 ist kein unendlicher Bruch.

Hinweis: Wenn Sie Floats oder Doubles vergleichen müssen, sollten Sie immer die Größe des Unterschieds und nicht nur die Gleichheit prüfen.

1voto

Sergey Aslanov Punkte 2377

Führen Sie den folgenden Code aus, um zu sehen, wie die Umwandlung von float in double in diesen Fällen funktioniert

    NumberFormat nf = new DecimalFormat("0.00000000000000000000");

    System.out.println(nf.format(4.4f));
    System.out.println(nf.format(4.4));

    System.out.println(nf.format(4.5f));
    System.out.println(nf.format(4.5));

0voto

Valmond Punkte 2730

Das liegt an einem Rundungsfehler, wenn der Double-Wert zu einem Float-Wert abgeschnitten wird. Manchmal bekommt man es, manchmal nicht.

4,4f ist ein Float und 4,4 ist ein Double.

0voto

stacker Punkte 65961

Ihr Programm vergleicht einen 16-Bit-Float-Wert mit einem 32-Bit-Double-Wert. Intern wird er als IEEE754 Die Differenz ist also ein Rundungsfehler, der in einigen Fällen aufgrund unterschiedlicher Genauigkeit zu dieser Ungleichheit führt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X