1. Introduction à BigDecimal
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-scale ).
2. Introduction de BigDecimal
Lorsque vous utilisez des langages de programmation Java tels que la banque et la finance qui nécessitent un calcul de haute précision des valeurs numériques, nous utilisons souvent BigDecimal et BigInteger au lieu des types int , long , float et double communs, en particulier lorsque vous traitez des données à virgule flottante.
Jetons d'abord un coup d'œil à une démonstration de code de l'utilisation du type de données de base double pour les résultats de calcul et d'impression:
classe publique Mainclass {public static void main (String [] args) {System.out.println (0,02 + 0,01); System.out.println (0,05 + 0,01); }}Les résultats sont les suivants:
0.030.0600000000000000000000005
La question est: pourquoi les données avec le deuxième résultat apparaissent-elles? La raison fondamentale est que notre ordinateur est binaire et que le binaire ne peut pas représenter avec précision un nombre de points flottants. Il existe certaines erreurs lorsque le CPU utilise la méthode "Mandrel et Exponent" (méthode de notation scientifique) pour exprimer des nombres de points flottants. Par conséquent, lorsque les exigences de précision des données sont relativement élevées, la classe BigDecimal doit encore être utilisée, bien que la vitesse de calcul soit légèrement plus lente.
3. Utilisation du BigDecimal
Il existe deux façons de créer un objet BigDecimal: le constructeur et la méthode statique publique ( BigDecimal.valueOf ). Deux points doivent être prêts à faire attention:
1. Le constructeur comprend deux formulaires qui utilisent des types de données de base et des chaînes comme paramètres. Ce dernier est recommandé, tel que: new BigDecimal(Double.valueOf(0.09)) . Vous pouvez l'essayer. Le résultat de sortie System.out.println(new BigDecimal(0.06).toString()); La déclaration est: 0.0599999999999999999779553950749686919152736663818359375
2. Lorsque décimal imprime le journal ou se convertit en types de données de base, essayez d'utiliser la méthode publique xxxValue() fournie par elle, comme doubleValue() , au lieu d'un toString()
4. Mode d'arrondi BigDecimal
Bien que la base de données stocke un numéro de point flottant de haute précision, il est généralement nécessaire de limiter le nombre de chiffres décimaux lorsqu'il est affiché dans les applications, telles que deux à trois décimales. Pour le moment, vous devez utiliser la fonction SetScale ( int newScale, int roundingMode ). En tant que variable statique publique de BigDecimal, il existe de nombreuses règles de fonctionnement pour le mode d'arrondi (mode d'arrondi) et il existe huit types publics. Voici une explication, et le document officiel le présente également.
1. Round_up
Autour de zéro. Abandonnez la pièce non nulle et ajoutez un numéro adjacent à la pièce non nulle.
2. Round_down
Rond dans la direction près de zéro. Abandonnez la pièce non nulle et, en même temps, le nombre adjacent de la pièce ne sera pas rejeté en en ajoutant un à la pièce non nulle et en interceptant le comportement.
3. Round_ceiling
Rond dans le sens de l'infini. S'il s'agit d'un nombre positif, le résultat d'arrondi est le même que Round_up; S'il s'agit d'un nombre négatif, le résultat d'arrondi est le même que Round_down. Remarque: Ce mode ne réduit pas la taille de la valeur.
4. Round_floor
Rond dans le sens de l'infini négatif. S'il s'agit d'un nombre positif, le résultat d'arrondi est le même que Round_down; S'il s'agit d'un nombre négatif, le résultat d'arrondi est le même que Round_up. Remarque: Ce mode n'augmente pas la taille de la valeur.
5. Round_half_up
L'arrondi au nombre "le plus proche" est un mode d'arrondi d'arrondi vers le haut si la distance à deux nombres adjacents est égal. Si la pièce est jetée> = 0,5, le comportement d'arrondi est le même que Round_up; Sinon, le comportement d'arrondi est le même que Round_down. Ce modèle est ce que nous appelons souvent notre "arrondissement".
6. Round_half_down
L'arrondissement du nombre "le plus proche", si la distance à deux nombres adjacents est égal, est un mode d'arrondissement d'arrondissement. Si la pièce jetée> 0,5, le comportement d'arrondi est le même que Round_up; Sinon, le comportement d'arrondi est le même que Round_down. Ce modèle est ce que nous appelons souvent nos «arrondissements».
7. Round_half_even
Rond au nombre "le plus proche", si la distance à deux nombres adjacentes est égal, les nombres pair adjacents sont arrondis. Si le nombre impair à gauche de la pièce est jeté, le comportement d'arrondi est le même que Round_half_up; S'il s'agit d'un nombre uniforme, le comportement d'arrondi est le même que Round_half_down. Remarque: Ce mode d'arrondi minimise l'erreur d'accumulation lors de la série de calculs répétés. Ce mode d'arrondi est également appelé "Méthode d'arrondi bancaire" et est principalement utilisé aux États-Unis. Round six en six et cinq en deux situations. Si le précédent est un nombre impair, il entrera dans la position, sinon il sera abandonné.
8. Round_unnessary
Le fonctionnement de la demande d'affirmation a des résultats précis, donc l'arrondi n'est pas requis. Si ce mode d'arrondi est spécifié pour une opération qui obtient le résultat exact, un arithmeticexception est lancé.
Ci-dessous, donnons un exemple pour illustrer les résultats du calcul numérique en différents modes d'arrondi, en gardant une décimale:
5. Résumé
Ce qui précède est l'introduction entière du BigDecimal et de huit modes d'arrondi de Java. J'espère que le contenu de cet article sera utile à tout le monde pour apprendre Java.