# Probleme mit double rechnen



## webid (6. Jan 2010)

Hallo,

wenn ich zwei double Zahlen subtrahieren will, kommt folgender Fehler (siehe ausgabe)


```
public static void main(String[] args) {
		// TODO Auto-generated method stub
		double a = 5.64;
		double b = 2.20;
		
		double c = a - b;
		
		System.out.println(c);
		
}
```

Ausgabe: 3.4399999999999995

Was muss ich machen, damit auch wirklich 3,44 da steht.

Glriche Problem mit 2,22 - 2,20

Danke im Voraus


----------



## Spin (6. Jan 2010)

Ähm , deine Lösung ist doch keinesfalls ein Fehler

Um eine entsprechende Endung zu definieren musst du mit DecimalFormat arbeiten.


```
import java.text.*;
public class DezimalFormatTest
{
  public static void main( String[] args )
  {
    double d = 12345.67890;
    DecimalFormat df =   new DecimalFormat  ( ",##0.00" );
    System.out.println(   df.format(d)   );           // 12.345,68
  }
}
```


Wenn dir das noch zu kompliziert ist , kannst du auch casten.
Dass heißt du kannst es auf eine ganze Zahl konvertieren.



```
public static void main(String[] args) {
        // TODO Auto-generated method stub
        double a = 5.64;
        double b = 2.20;
        
        double c = a - b;
        
        System.out.println((int)c);
        
}
```

Was fällt mir noch ein?


```
System.out.format("%f %1$6.2f %1$6.2E %n", 3.121592); // Fließkommazahl
```

Damit gehts auch.
Du veränderst den Wert.

Anders weiß ich jetzt leider auch nicht , wie du auf genau 2 Stellen hinter dem Komma ausgaben kannst , gruß


----------



## faetzminator (6. Jan 2010)

Versuche es mit [c]Math.round()[/c]. Solche Datentypen haben aber nunmal CPU-/rechnungsbedingt Rundungsfehler.


----------



## Landei (6. Jan 2010)

Die Erklärung für obiges Phänomen ist ganz einfach: Im Binärsystem sind 1/10, 1/100 u.s.w. unendliche periodische Brüche, so wie es im Dezimalsystem 1/3 ist. Wenn man 1/3 als 0.33333333333333 repräsentiert (irgendwo muss man ja aufhören), ergibt sich eben 3*1/3 = 0.999999999999999. Ich würde dazu raten, die Zahl wirklich so zu lassen wie sie ist, nur bei der Ausgabe Formatierungshilfen (System.out.printf, java.text.DecimalFormat) zu verwenden.

Für festgelegte Genauigkeiten mit vorgegebenen Rundungsmodi gibt es auch die Klasse java.math.BigDecimal


----------



## C_A (20. Feb 2010)

... gelöscht ....


----------

