Ne soyez pas accro au Big Decimal de Java

Notez que mon collègue était accro au traitement de Big Decimal.

Qu'est-ce qui est immuable?

~~ Valeur de la variable ~~ Lors de la manipulation d'un objet, la réécriture de la valeur de l'objet ~~ variable ~~ lui-même est appelée "mutable", et ne pas la réécrire est appelée "immuable". Pour Java, ~~ int et double ~~ Calendar sont mutables et String est immuable.

Qu'est-ce que BigDecimal?

Documentation de l'API Big Decimal https://docs.oracle.com/javase/jp/8/docs/api/java/math/BigDecimal.html

Jetons un coup d'œil à la méthode add qui ajoute.

/**
valeur(this+augend)L'échelle est max(this.scale(), augend.scale())Renvoie la grande décimale qui est.
Paramètres: augend -La valeur à ajouter à ce grand décimal.
Valeur de retour: this + augend
*/
public BigDecimal add(BigDecimal augend)

Maintenant, quelle est la sortie du code suivant?

public static void main(String args[]) {
    BigDecimal a = new BigDecimal("1");
    BigDecimal b = new BigDecimal("2");
    a.add(b);
    System.out.println(a);
}

Résultat de sortie.

1

cette? N'est-ce pas 3? Je pensais que tu. J'ai oublié une phrase importante dans la documentation de l'API.

** Immuable **, nombre décimal signé de précision arbitraire.

En d'autres termes, ce code signifiait ** créer un nouvel objet BigDecimal avec une valeur de a + b ** et renvoyer cet objet. La valeur d'un lui-même ne change pas du tout.

a.add(b);

C'était un code qui récupère une valeur numérique de la base de données avec Big Decimal et calcule l'argent, mais j'ai poursuivi le processus sans attribuer le résultat de la méthode telle que l'ajout à la variable, et c'était un bogue brillant.

Vous ne pouvez pas voir des choses immuables simplement en écrivant le code ... C'était un vilain bug.

Recommended Posts

Ne soyez pas accro au Big Decimal de Java
Java Big Decimal
Grand décimal à Kotlin