Ajout pour BigDecimal


155

Je veux faire des sommes simples avec des valeurs monétaires exprimées en BigDecimaltype.

BigDecimal test = new BigDecimal(0);
System.out.println(test);
test.add(new BigDecimal(30));
System.out.println(test);
test.add(new BigDecimal(45));
System.out.println(test);

Evidemment je ne comprends pas bien l' BigDecimalarithmétique, voir la sortie derrière.

Test
0
0
0

Quelqu'un peut m'aider?

Réponses:


275

Le BigDecimalest immuable, vous devez donc faire ceci:

BigDecimal result = test.add(new BigDecimal(30));
System.out.println(result);

27
Je peux comprendre la confusion. Même s'il est indiqué que BigDecimal est immuable, la documentation pourrait être meilleure. Par exemple, l'état de la documentation pour la méthode add(..): "augend - valeur à ajouter à ce BigDecimal.". De plus, dire "... renvoie un nouveau BigDecimal ..." au lieu de "... renvoie un BigDecimal ..." serait une bonne idée. Peut-être que je suis juste pinailleur, mais à mon humble avis, il y a place à l'amélioration ici :-)
pauluss86

3
Juste une remarque, BigDecimal n'est pas complètement immuable car ce n'est pas final comme String ...
Zai

@Zai Mais ce n'est qu'un bug d'implémentation, pas par conception. Le code maintenable ne devrait pas exploiter cela.
Chris Jester-Young

1
et pourquoi l'implémentation Java est-elle un peu étrange?! beaucoup d'autres langues utilisent simplement + entre les types de données numériques
sepehr

33

Il semble que dans la documentation Java ici , add renvoie un nouveau BigDecimal:

BigDecimal test = new BigDecimal(0);
System.out.println(test);
test = test.add(new BigDecimal(30));
System.out.println(test);
test = test.add(new BigDecimal(45));
System.out.println(test);

16
BigDecimal test = new BigDecimal(0);
System.out.println(test);
test = test.add(new BigDecimal(30));
System.out.println(test);
test = test.add(new BigDecimal(45));
System.out.println(test);

11

C'est en fait assez facile. Faites juste ceci:

BigDecimal test = new BigDecimal(0);
System.out.println(test);
test = test.add(new BigDecimal(30));
System.out.println(test);
test = test.add(new BigDecimal(45));
System.out.println(test);

Voir également: BigDecimal#add(java.math.BigDecimal)


Intéressant que votre réponse soit identique à celle de Maurice Perry. Si vous vouliez ajouter le lien, vous devriez avoir juste édité le sien.
forresthopkinsa

En fait, je ne l'ai pas copié mais je pense que nous avons tous les deux écrit la même réponse en même temps (c'est simplement le correctif pour le code donné de toute façon). J'ai juste pris une minute de plus pour rechercher le lien correct.
nfechner

Wow, c'est assez intéressant!
forresthopkinsa

9

BigInteger est immuable, vous devez le faire,

  BigInteger sum = test.add(new BigInteger(30));  
  System.out.println(sum);

4
//you can do in this way...as BigDecimal is immutable so cant set values except in constructor

BigDecimal test = BigDecimal.ZERO;
BigDecimal result = test.add(new BigDecimal(30));
System.out.println(result);

result would be 30

3
BigDecimal no = new BigDecimal(10); //you can add like this also
no = no.add(new BigDecimal(10));
System.out.println(no);

20


2

Vous pouvez également le faire comme ceci:

BigDecimal A = new BigDecimal("10000000000");
BigDecimal B = new BigDecimal("20000000000");
BigDecimal C = new BigDecimal("30000000000");
BigDecimal resultSum = (A).add(B).add(C);
System.out.println("A+B+C= " + resultSum);

Impressions:

A + B + C = 60000000000


1

Utilisation de lambdas Java8

List<BigDecimal> items = Arrays.asList(a, b, c, .....);

items.stream().filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);

Cela couvre les cas où tout ou partie des objets de la liste est nul.


0
BigDecimal demo = new BigDecimal(15);

Il est immuable car il stocke en interne votre entrée, c'est-à-dire (15) comme le final private final BigInteger intVal; même concept utilise au moment de la création de la chaîne que chaque entrée est finalement private final char value[];stockée dans . Il n'y a donc pas de bogue implémenté.


0

Juste un autre exemple à ajouter BigDecimals. Le point clé est qu'ils sont immuables et qu'ils ne peuvent être initialisés que dans le constructeur. Voici le code:

import java.util.*;
import java.math.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc;
        boolean first_right_number = false;
        BigDecimal initBigDecimal = BigDecimal.ZERO;
        BigDecimal add1 = BigDecimal.ZERO;
        BigDecimal add2 = BigDecimal.ZERO;

        while (!first_right_number)
        {
            System.out.print("Enter a first single numeric value: ");
            sc = new Scanner(System.in);
            if (sc.hasNextBigDecimal()) 
            {
                first_right_number = true;
                add1 = sc.nextBigDecimal();
            }
        }

        boolean second_right_number = false;
        while (!second_right_number)
        {
            System.out.print("Enter a second single numeric value: ");
            sc = new Scanner(System.in);
            if (sc.hasNextBigDecimal()) 
            {
                second_right_number = true;
                add2 = sc.nextBigDecimal();
            }
        }
        BigDecimal result = initBigDecimal.add(add1).add(add2);
        System.out.println("Sum of the 2 numbers is: " + result.toString());
    }
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.