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?

Sergio del Amo
la source

Réponses:

275

Le BigDecimalest immuable, vous devez donc faire ceci:

BigDecimal result = test.add(new BigDecimal(30));
System.out.println(result);
Vincent Ramdhanie
la source
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);
Ankur Goel
la source
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);
Maurice Perry
la source
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)

nfechner
la source
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);
Codeur ZZ
la source
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
MAK
la source
3
BigDecimal no = new BigDecimal(10); //you can add like this also
no = no.add(new BigDecimal(10));
System.out.println(no);

20

Yatish
la source
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

Artur Krawczyk
la source
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.

DaithiG
la source
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é.

snipersnack
la source
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());
    }
}
Paolo Leoncini
la source