Das hat nichts mit Java zu tun, sondern mit der Binärdarstellung der Gleitkommazahlen. Darüber gibt es gefühlte 999999999 Themen hier im Forum und Seiten im Internet, da wirst du bestimmt weitere Infromationen finden.
0.9999999999999... = 1dann muss doch
3/3 = 0.9999999999999
sein, obwohl wir alle wissen, dass 3/3 = 1 ist.
0.9999999999999... = 1
Theorie :
1/3 = 0.3333333333333
2/3 = 0.6666666666666
dann muss doch
3/3 = 0.9999999999999
sein, obwohl wir alle wissen, dass 3/3 = 1 ist.
Da haste deine Verschwörungstheorie. 0.999999999 gibt es nicht:autsch:
Btw. Thema als erledigt markieren wäre auch nicht schlecht...
public class Test {
public static void main(String[] args) {
float a = 2.8788f;
float b = 0.711f;
float c = 2.5286f;
System.out.println(a + b + c);
System.out.println(a + c + b);
}
}
java liefert zwei verschiedenen Ergebnis, obwoahl float in java hat 7 stellige Genauigkeit.
Avoid float and double if exact answers are required!
Lieber fatfox,
zuerst einmal zum Einbrennen (Effective Java Second Edition, J. Bloch):
Zweitens, lese bitte im folgenden Link den Erläuterungen zu Punkt 20: Java Beginners Faq at JavaRanch
Verfolge und studiere bitte die zwei in Punkt 20 aufgeführten Links.
fatfox hat gesagt.:Wieso kann C++ immer die richtige Lösung liefern? Bedeutet C++ genauer als Java ist?
Bei C/C++ kann es jedoch sein, dass der dort verwendete Compiler zur Konstantenfaltung einfach den Code zur Berechnung auf der Maschine ausführt, auf der er kompiliert wird, und anschließend das Ergebnis in das Kompilat einsetzt. Damit wird das Ergebnis beim Kompilieren also abhängig davon, welche Maschine dabei benutzt wird.
Es kann also sein, dass bei C/C++ der Compiler mit einer viel höheren Genauigkeit (je nach Hardware etc., z.B. mit double-Genauigkeit) gerechnet hat und sich dadurch das Rundungsproblem an der Stelle nicht bemerkbar macht.
private static strictfp void test(){
final float fa = Float.parseFloat("1.0");
final float fb = Float.parseFloat("0.9");
final float fres = fa - fb;
System.out.println("float: " + fres);
final double da = Double.parseDouble("1.0");
final double db = Double.parseDouble("0.9");
final double dres = da - db;
System.out.println("double: " + dres);
final BigDecimal ba = new BigDecimal("1.0");
final BigDecimal bb = new BigDecimal("0.9");
final BigDecimal bres = ba.subtract(bb);
System.out.println("BigDecimal: " + bres);
System.out.println("BigDecimal als double: " + bres.doubleValue());
}
float: 0.100000024
double: 0.09999999999999998
BigDecimal: 0.1
BigDecimal als double: 0.1