Problème :
Lorsque vous travaillez sur deux valeurs de type double, la valeur du résultat sera parfois anormale. Par exemple :
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);
Sortie :
39,9899999999999995
0,3399999999999999997
3,3000000000000003
0. 0000000000001
Solution :
Les types à virgule flottante simples float et double en Java ne peuvent pas être utilisés, car cela est normal dans la plupart des cas, mais parfois le problème illustré ci-dessus se produira. Ce problème n'est en fait pas un bug JAVA, car l'ordinateur lui-même est binaire et les nombres à virgule flottante ne sont en réalité que des approximations. Par conséquent, lors de la conversion de nombres binaires à virgule flottante décimales, la précision est facilement perdue, ce qui entraîne une diminution de la précision.
Pour garantir l'exactitude, vous devez utiliser la classe BigDecimal et vous ne pouvez pas convertir directement de double en BigDecimal. Vous devez convertir double en chaîne puis en BigDecimal. C'est-à-dire que la méthode BigDecimal(double val) ne peut pas être utilisée et vous constaterez qu'elle n'a aucun effet. Pour utiliser la méthode BigDecimal(String val). Des exemples spécifiques sont présentés ci-dessous.
Exemples de quatre opérations arithmétiques de type 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(); }