« Programmation Java/Nombre de taille arbitraire » : différence entre les versions

Contenu supprimé Contenu ajouté
Ligne 242 :
 
La classe <code>BigDecimal</code> représente un nombre décimal de taille arbitraire défini par un entier de taille arbitraire (type <code>BigInteger</code>) et un nombre entier de type <code>int</code> définissant la position de la virgule.
Il y a donc une limite (celle du type <code>int</code> 32 bits) sur l'échelle.
 
<syntaxhighlight lang="java">
Ligne 321 ⟶ 322 :
a.scale() // 2
</syntaxhighlight>
 
{{Attention|La modification directe de la position de la virgule avec une grande différence allouera une énorme quantité de mémoire pour ajouter les zéros, peut détériorer les performances du processeur. Il faut donc veiller à ne pas faire de grand changements d'échelle.}}
 
=== Opérations arithmétiques ===
 
Les opérateurs en Java ne s'appliquent qu'aux types primitifs, excepté le plus <code>+</code> permettant de concaténer des chaînes de caractères.
Pour effectuer des opérations sur des instances de <code>BigDecimal</code>, il faut appeler les méthodes résumées dans le tableau ci-dessous.
Ces méthodes sont similaires à celles de la classe <code>BigInteger</code>, avec une variante acceptant un objet <code>MathContext</code> pour arrondir le résultat, et un comportement différent pour la division.
Une instance de <code>BigDecimal</code> étant immuable, les méthodes ne modifie pas l'objet lui-même mais retournent une nouvelle instance pour le résultat.
Si ce n'était pas le cas, il serait possible de modifier la valeur de <code>BigDecimal.ONE</code> par exemple, ce qui fausserait les calculs utilisant la constante.
 
{| class="wikitable"
|+ Méthodes pour les opérateurs arithmétiques
! Opérateur équivalent
! <syntaxhighlight lang="java" inline>BigDecimal a.</syntaxhighlight>
! Description
|-
| style="text-align:center;" | <code>-</code> || negate()
| Retourne le résultat de l'inversion de signe <syntaxhighlight lang="java" inline>-a</syntaxhighlight>
|-
| style="text-align:center;" | <code>-</code> || negate(MathContext mc)
| Retourne le résultat arrondi de l'inversion de signe <syntaxhighlight lang="java" inline>-a</syntaxhighlight>
|-
| style="text-align:center;" | <code>-</code> || plus()
| Retourne le nombre <syntaxhighlight lang="java" inline>+a</syntaxhighlight> (méthode pour la symétrie avec negate)
|-
| style="text-align:center;" | <code>-</code> || plus(MathContext mc)
| Retourne le nombe arrondi <syntaxhighlight lang="java" inline>+a</syntaxhighlight>
|-
| style="text-align:center;" | <code>-</code> || round(MathContext mc)
| Retourne le nombre arrondi <syntaxhighlight lang="java" inline>Math.round(a)</syntaxhighlight>.
|-
| style="text-align:center;" | <code>+</code> || add(BigInteger b)
| Retourne le résultat de l'addition <syntaxhighlight lang="java" inline>a+b</syntaxhighlight>
|-
| style="text-align:center;" | <code>+</code> || add(BigInteger b, MathContext mc)
| Retourne le résultat arrondi de l'addition <syntaxhighlight lang="java" inline>a+b</syntaxhighlight>
|-
| style="text-align:center;" | <code>-</code> || subtract(BigInteger b)
| Retourne le résultat de la soustraction <syntaxhighlight lang="java" inline>a-b</syntaxhighlight>
|-
| style="text-align:center;" | <code>-</code> || subtract(BigInteger b, MathContext mc)
| Retourne le résultat arrondi de la soustraction <syntaxhighlight lang="java" inline>a-b</syntaxhighlight>
|-
| style="text-align:center;" | <code>*</code> || multiply(BigInteger b)
| Retourne le résultat de la multiplication <syntaxhighlight lang="java" inline>a*b</syntaxhighlight>
|-
| style="text-align:center;" | <code>*</code> || multiply(BigInteger b, MathContext mc)
| Retourne le résultat arrondi de la multiplication <syntaxhighlight lang="java" inline>a*b</syntaxhighlight>
|-
| style="text-align:center;" | <code>/</code> || divide(BigInteger b)
| Retourne le résultat de la division <syntaxhighlight lang="java" inline>a/b</syntaxhighlight>.
 
{{Attention|Comme cette opération n'effectue aucun arrondi, si le résultat génère un nombre infini de chiffres, une exception ArithmeticException est lancée.}}
|-
| style="text-align:center;" | <code>/</code> || divide(BigInteger b, MathContext mc)
| Retourne le résultat arrondi de la division <syntaxhighlight lang="java" inline>a/b</syntaxhighlight>
|-
| style="text-align:center;" | <code>%</code> || remainder(BigInteger b)
| Retourne le reste de la division <syntaxhighlight lang="java" inline>a%b</syntaxhighlight>
|-
| style="text-align:center;" | <code>%</code> || remainder(BigInteger b, MathContext mc)
| Retourne le reste arrondi de la division <syntaxhighlight lang="java" inline>a%b</syntaxhighlight>
|-
| style="text-align:center;" | <code>/ %</code> || divideAndRemainder(BigInteger b)
| Retourne un tableau de deux <code>BigInteger</code> : le quotient et le reste de la division <syntaxhighlight lang="java" inline>{a/b, a%b}</syntaxhighlight>
|-
| style="text-align:center;" | <code>/ %</code> || divideAndRemainder(BigInteger b, MathContext mc)
| Retourne un tableau de deux <code>BigInteger</code> : le quotient et le reste arrondis de la division <syntaxhighlight lang="java" inline>{a/b, a%b}</syntaxhighlight>
|}
 
Comme les expressions complexes sur ces nombres entraînent la création de multiples instances, il n'est pas utile de garder les résultats intermédiaires, sauf de manière temporaire pour déboguer l'expression.
Il est donc courant d'enchaîner les méthodes :
 
<syntaxhighlight lang="java">
BigDecimal
a = new BigDecimal("1500000000"),
b = new BigDecimal("5780.00057"),
c = new BigDecimal("12345.67");
 
// d = ( a+b ) * c / 10 Arrondi à 8 chiffres de précision
BigDecimal d = a.add(b).multiply(c).divide(BigDecimal.TEN, 8, BigDecimal.ROUND_HALF_EVEN);
</syntaxhighlight>
 
Autres opérations arithmétiques sur ces nombres :
 
{| class="wikitable"
|+ Autres opérations arithmétiques
! <syntaxhighlight lang="java" inline>BigDecimal a.</syntaxhighlight>
! Description
|-
| abs()
| Retourne la valeur absolue <syntaxhighlight lang="java" inline>Math.abs(a)</syntaxhighlight>
|-
| signum()
| Retourne le signe sous la forme d'un entier <syntaxhighlight lang="java" inline>Math.signum(a)</syntaxhighlight> (-1 négatif, 0 zéro, +1 positif)
|-
| max(BigDecimal b)
| Retourne le plus grand des deux nombres.
|-
| min(BigDecimal b)
| Retourne le plus petit des deux nombres.
|-
| pow(int n)
| Retourne le calcul de la puissance n du nombre <math>a^n</math>.
|-
| pow(int n, MathContext mc)
| Retourne le calcul arrondi de la puissance n du nombre <math>a^n</math>.
|}
 
=== Comparaison ===