Maison >Java >javaDidacticiel >Solution au résultat anormal d'une opération de double type en Java

Solution au résultat anormal d'une opération de double type en Java

高洛峰
高洛峰original
2017-01-23 16:08:322214parcourir

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();
  }
3. Multiplication

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();
  }
4. Division

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();
 }
Le paramètre d'échelle est indivisible, précisez la précision.

La solution ci-dessus au résultat anormal de l'opération de double type en Java est tout le contenu partagé par l'éditeur. J'espère qu'il pourra vous donner une référence, et j'espère que vous soutiendrez le site Web PHP chinois.

Pour plus d'articles sur les solutions aux résultats anormaux des opérations de double type en Java, veuillez prêter attention au site Web PHP chinois !

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn