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

高洛峰
Libérer: 2017-01-23 16:08:32
original
2207 Les gens l'ont consulté

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);
Copier après la connexion

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();
  }
Copier après la connexion

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();
  }
Copier après la connexion
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();
  }
Copier après la connexion
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();
 }
Copier après la connexion
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 !

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal