Introduction à BigDecimal
L'explication dans le document JDK (chinois) est la suivante:
Nombre décimal immuable et signé de précision arbitraire. BigDecimal se compose d'une valeur entière non à l'échelle de toute précision et d'une échelle entière 32 bits. S'il est nul ou positif, l'échelle est le nombre de chiffres après le point décimal. S'il s'agit d'un nombre négatif, multipliez la valeur de non-échelle du nombre par une puissance d'échelle négative de 10. Par conséquent, la valeur représentée par BigDecimal est (UNSCALEDVALUE × 10-échelle).
Explication spécifique
1. "La valeur de l'objet BigDecimal est immuable". Cela montre cette fonctionnalité dans la fonction de fonctionnement de l'objet BigDecimal:
La copie de code est la suivante: bigdecimal a = new BigDecimal ("1.22");
System.out.println ("Construire avec une valeur de chaîne:" + a);
BigDecimal B = nouveau BigDecimal ("2.22");
a.add (b);
System.out.println ("A Plus B est:" + a);
Il est facile de penser qu'il sortira:
Construire avec une stringvalue: 1.22
A plus B est: 3,44
Mais en fait, un plus B est: 1,22
2. "BigDecimal se compose d'une valeur entière non à l'échelle de toute précision et d'une échelle entière 32 bits. Si la valeur de l'échelle est nulle ou positive, l'échelle est le nombre de chiffres après le point décimal." Cette phrase peut être lue comme ceci:
Par exemple: -12 et 13.412
Exprimé comme: -12 × 10-0 et 13412 × 10-3
Ici (les valeurs et les échelles de non-échelle) sont représentées comme: [-12, 0] et [13412, 3] respectivement
3. "Si la valeur d'échelle est un nombre négatif, multipliez la valeur non échelle du nombre par une puissance d'échelle négative de 10". Cette phrase peut être lue comme ceci:
Par exemple: 120,00
Cette valeur est exprimée: 12000 × 10-2
Ici (valeur et échelle non échelonnées) sont exprimées comme suit: [12000, 2]
La valeur de l'échelle ici est toujours positive 2, mais effectuez les opérations suivantes:
Montant BigDecimal = nouveau BigDecimal ("- 120,00");
// Renvoie BigDecimal Numerical égal à cette décimale, mais supprime tous les zéros de queue de cette représentation.
montant = montant.striptrailingzeros ();
Cette valeur est exprimée: 12 × 10 - (- 1)
Ici (la valeur et l'échelle non à échelle) sont exprimées comme suit: [12, -1]
Notes sur l'utilisation
1. Constructeur
La copie de code est la suivante: bigdecimal adouble = new BigDecimal (1.22);
System.out.println ("Construire avec une double valeur:" + adouble);
Bigdecimal astring = new Bigdecimal ("1.22");
System.out.println ("Construire avec une valeur de chaîne:" + astrring);
Le résultat de sortie est le suivant:
Construire avec une double valeur: 1.219999999999999999999733546474089962430298328399658203125
Construire avec une valeur de chaîne: 1.22
Description de JDK:
a) Les résultats de la méthode de construction avec le type de paramètre double sont imprévisibles. Certaines personnes pourraient penser que le BigDecimal créé en écrivant NewBigDecimal (0,1) en Java est exactement égal à 0,1 (valeur non échelle 1, dont l'échelle est 1), mais elle est en fait égale à 0,10000000000000000000005551115123125782702118158404541015625. En effet, 0,1 ne peut pas être exprimé avec précision comme un double (ou pour ce cas, il ne peut pas être exprimé en toute décimale binaire de longueur finie). De cette façon, la valeur transmise dans la méthode de construction ne sera pas exactement égale à 0,1 (bien qu'elle soit sur une surface égale à cette valeur).
b) D'un autre côté, le constructeur de cordes est complètement prévisible: l'écriture sur NewBigDecimal ("0,1") créera un BigDecimal, qui est exactement le 0,1 attendu. Par conséquent, en comparaison, il est généralement recommandé d'utiliser d'abord le constructeur de chaîne.
c) Lorsque le double doit être utilisé comme source de BigDecimal, notez que ce constructeur fournit une conversion précise; Il ne fournit pas le même résultat que: utilisez d'abord la méthode double.tostring (double), puis utilisez le constructeur BigDecimal (String). Pour convertir Double en chaîne, vous pouvez également utiliser la méthode statique de String: String.ValueOf (double).
2. Fonctionnement. De plus, la soustraction, la multiplication et la division renvoient en fait un nouvel objet BigDecimal, car BigDecimal est immuable, et un nouvel objet sera généré lors de chaque étape de fonctionnement, donc a.Add (b); Bien que l'opération d'addition soit effectuée, A n'enregistre pas la valeur après l'opération d'addition. L'utilisation correcte doit être a = a.add (b);
exemple:
Déterminez si l'objet BigDecimal est un entier:
Copiez le code comme suit: Private Boolean isIntegerValue (BigDecimal BD) {
return bd.signum () == 0 || bd.scale () <= 0 || bd.striptrailingzeros (). Scale () <= 0;
}
Pourquoi faire ça? Veuillez tester l'exemple suivant:
Copiez le code comme suit: Montant BigDecimal = nouveau BigDecimal ("- 120.00"); // Veuillez essayer "0", "0,00", "1,00", "10,00" et "10.10" respectivement
System.out.println (quantité.signum ()); // positif et négatif
System.out.println (quantité.scale ()); //Échelle
System.out.println (quantité.striptrailingzeros (). Scale ()); // échelle après zéro
Référence: classe BigDecimal