Zahlformatierung

Status
Nicht offen für weitere Antworten.

InfoStud86

Mitglied
Hallo,

ich habe folgendes Problem. Ich habe ein String Array aus dem ich einzelne Double Werte extrahieren. Nun will ich die Double Werte aufaddieren. Mein Problem ist nun, dass Java irgendwie intern die Zahlenwerte "komisch" aufaddiert.
Hier mal mein Quelltext:
Code:
public double[] WG_Tag(String[] s){
		double sum = 0.000;
		double tmp[] = new double[3];
		
		for (int i = 0; i<s.length; i++){
			sum = sum + Double.valueOf(s[i]).doubleValue();
			System.out.println(i + " " + sum);
		}
		
		if (s.length > 0){
			int tmpS = s.length;
			tmp[0] = sum/tmpS;
                        //auch tmp[0] = sum /s.length;
		}
		else{
			System.out.println("Fehler in Statistic WR : Div0");
		}
		
		tmp[1] = min;
		tmp[2] = max;
		return tmp;
	}

Beispielhafter Input (String[]):

0.5
1.2
1.4
1.6
1.3
1.4
1.7
1.8
1.4
0.6

Ausgabe (bei
Code:
System.out.println(i + " " + sum);
)
i | sum
---------------
0 | 0.5
1 | 1.7
2 | 3.0999999999999996
3 | 4.699999999999999
4 | 5.999999999999999
5 | 7.399999999999999
6 | 9.099999999999998
7 | 10.899999999999999
8 | 12.299999999999999
9 | 12.899999999999999


Ich würde mich über hilfreiche Hinweise freuen
 
S

SlaterB

Gast
solche Fehler sind bei der CPU- + speicherfreundlichen normalen double-Berechnung normal

in einfachen Bits kann man einen Kommaanteil wie 0.1 eben schlecht darstellen,
etwa so wie man 1/3 im Dezimalsystem nur unzureichend mit 0.333333... darstellen kann

dagegen hilft, Zahlen mit NumberFormat auf wenige Nachkommazahlen zu runden,
12 Stellen oder so sind garantiert korrekt

---------

mit entsprechenen Aufwand läßt sich übrigens auch mit Kommazahlen ordentlich rechnen
 
B

Beni

Gast
Zum einen Rundungsfehler, zum anderen können garnicht alle Zahlen als double dargestellt werden.

Guck mal bei Wikipedia unter "Gleitkommazahl".

Und ja, das is ganz normal, vor der Ausgabe ein bisschen runden damit es schöner aussieht :wink:
 

André Uhres

Top Contributor
In Java soll man double/float nicht benutzen für Gleitkomma Arithmetik, benutz dazu BigDecimal.
Denn Java kann Gleitkomma nicht exakt darstellen.
 

Wildcard

Top Contributor
André Uhres hat gesagt.:
In Java soll man double/float nicht benutzen für Gleitkomma Arithmetik, benutz dazu BigDecimal.
Denn Java kann Gleitkomma nicht exakt darstellen.
Wie jetzt :shock:
Erstens hat das nichts mit Java zu tun, und zweitens ist BigDeciamal quälend langsam im Vergleich zu double.
Das benutzt man nur wenn es wirklich braucht.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben