Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
KlassenBigDecimal Multiplikation liefert nicht erwarteten Wert
Hallo,
kann mir jemand erklären warum bei der Multiplikation von zwei BigDecimal (mit den Werten 2,1 und 10000) nicht 21000 sondern 21000.000000000000888178419700125232338905334472656250000 rauskommt?
Java:
import java.math.BigDecimal;
public class Test {
public static void main(String[] args){
BigDecimal value1 = new BigDecimal(2.1);
BigDecimal value2 = new BigDecimal(10000.0);
BigDecimal result = value1.multiply(value2);
System.out.println(result);
}
}
Du musst den Double-Wert als String übergeben, dann bekommst dass richtige Ergebnis.
Java:
BigDecimal d = new BigDecimal(Double.toString(2.1));
BigDecimal e = new BigDecimal(Double.toString(10000.0));
Mit BigDecimal kannste genauer rechnen, du übergibst aber einen DoubleWert, welcher eben nicht so genau ist wie BigDecimal. Daher kommen die Abweichungen (grob gesagt).
Und wenn der eigentliche Wert größer ist als ein Double? Hier hab ich jetzt mal kleine Werte genommen, aber es hat einen Grund warum ich BigDecimal nutze^^
Da es aber scheinbar nur Probleme gibt wenn ich tatsächlich Nachkommastellen habe ... hast du mir glaube ich aber trotzdem schon geholfen. Danke!
Bei größeren Werten kannst du die Zahl als String übergeben:
Java:
import java.math.BigDecimal;
public class Test {
public static void main(String[] args){
BigDecimal value1 = new BigDecimal("2.1");
BigDecimal value2 = new BigDecimal("1000000000000000000000000.0");
BigDecimal result = value1.multiply(value2);
System.out.println(result);
}
}
Manche Zahlen können nicht genau mit double dargestellt werden und deswegen hast du merkwürdige "Nachkommastellen". HIER mal der Hauptartikel: What Every Computer Scientist Should Know About Floating-Point Arithmetic
Die Nachkomma stellen werden als 2^-n dargestellt kannst ja mal mit 0,8 durchrechnen da kommst in ne Endlosschleife dadurch läufst du irgendwann aus deinen wertebereich und es wird was weggelassen was zu krummen ergebnissen führt. Oder du lässt dein Pc mal 0.1 +0.7 rechnen.