Problem:
Bei der Arbeit mit zwei Double-Typ-Werten ist der Ergebniswert manchmal abnormal. Zum Beispiel:
System.out.println(19.99+20); System.out.println(1.0-0.66); System.out.println(0.033*100); System.out.println(12.3/100);
Ausgabe:
39,989999999999995
0,33999999999999997
3,3000000000000003
0, 1230 0000000000001
Lösung:
Die einfachen Gleitkommatypen float und double in Java können nicht bedient werden, da dies in den meisten Fällen normal ist, gelegentlich jedoch das oben gezeigte Problem auftritt. Dieses Problem ist eigentlich kein JAVA-Fehler, da der Computer selbst binär ist und Gleitkommazahlen eigentlich nur Näherungen sind. Daher geht bei der Konvertierung von binären in dezimale Gleitkommazahlen leicht die Genauigkeit verloren, was zu einer Verringerung der Genauigkeit führt.
Um die Genauigkeit sicherzustellen, müssen Sie die BigDecimal-Klasse verwenden und können nicht direkt von double in BigDecimal konvertieren. Sie müssen double in einen String und dann in BigDecimal konvertieren. Das heißt, die Methode BigDecimal (double val) kann nicht verwendet werden und Sie werden feststellen, dass sie keine Wirkung hat. Zur Verwendung der BigDecimal(String val)-Methode. Konkrete Beispiele sind unten aufgeführt.
Beispiele für vier arithmetische Operationen vom Typ Double:
1. Addition
public static double add(double a1, double b1) { BigDecimal a2 = new BigDecimal(Double.toString(a1)); BigDecimal b2 = new BigDecimal(Double.toString(b1)); return a2.add(b2).doubleValue(); }
2 >
public static double sub(double a1, double b1) { BigDecimal a2 = new BigDecimal(Double.toString(a1)); BigDecimal b2 = new BigDecimal(Double.toString(b1)); return a2.subtract(b2).doubleValue(); }
public static double mul(double a1, double b1) { BigDecimal a2 = new BigDecimal(Double.toString(a1)); BigDecimal b2 = new BigDecimal(Double.toString(b1)); return a2.multiply(b2).doubleValue(); }
public static double div(double a1, double b1, int scale) { if (scale < 0) { throw new IllegalArgumentException("error"); } BigDecimal a2 = new BigDecimal(Double.toString(a1)); BigDecimal b2 = new BigDecimal(Double.toString(b1)); return a2.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue(); }