Adição para BigDecimal

155

Quero fazer algumas somas simples com alguns valores de moeda expressos em BigDecimaltipo.

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);

Obviamente, eu não entendo bem a BigDecimalaritmética, veja a saída por trás.

Test
0
0
0

Alguém pode me ajudar?

Sergio del Amo
fonte

Respostas:

275

O BigDecimalé imutável, então você precisa fazer isso:

BigDecimal result = test.add(new BigDecimal(30));
System.out.println(result);
Vincent Ramdhanie
fonte
27
Eu posso entender a confusão. Mesmo que seja declarado que o BigDecimal é imutável, a documentação poderia ser melhor. Por exemplo, os documentos afirmam para o método add(..): "augend - value a ser adicionado a este BigDecimal.". Além disso, dizer "... retorna um novo BigDecimal ..." em vez de "... retorna um BigDecimal ..." seria um toque agradável. Talvez eu só estou criticando, mas IMHO há espaço para melhorias aqui :-)
pauluss86
3
Apenas uma nota lateral, BigDecimal não é completamente imutável como não é final, como cordas ...
Zai
@ Zai Mas isso é apenas um bug de implementação, não por design. O código de manutenção não deve explorar isso.
Chris Jester-Young
1
e por que a implementação do Java é um pouco estranha ?! muitas outras línguas simplesmente usar + entre tipos de dados numéricos
sepehr
33

Parece que, a partir dos documentos Java aqui, add adiciona um novo 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
fonte
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
fonte
11

Na verdade, é bastante fácil. Apenas faça o seguinte:

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);

Veja também: BigDecimal#add(java.math.BigDecimal)

nfechner
fonte
Interessante que sua resposta seja idêntica à de Maurice Perry. Se você quiser adicionar o link, deveria ter editado o dele.
forresthopkinsa
Na verdade, não copiei, mas acho que nós dois escrevemos a mesma resposta ao mesmo tempo (é simplesmente a correção para o código fornecido). Demorei mais um minuto a procurar o link correto.
Nfechner 9/17
Uau, isso é bem interessante!
Forresthopkinsa
9

BigInteger é imutável, você precisa fazer isso,

  BigInteger sum = test.add(new BigInteger(30));  
  System.out.println(sum);
ZZ Coder
fonte
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
fonte
3
BigDecimal no = new BigDecimal(10); //you can add like this also
no = no.add(new BigDecimal(10));
System.out.println(no);

20

Yatish
fonte
2

Você também pode fazer assim:

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);

Impressões:

A + B + C = 60000000000

Artur Krawczyk
fonte
1

Usando Java8 lambdas

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

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

Isso abrange os casos em que alguns ou todos os objetos da lista são nulos.

DaithiG
fonte
0
BigDecimal demo = new BigDecimal(15);

É imutável porque ele armazena internamente sua entrada, ou seja, (15) final private final BigInteger intVal; e o mesmo conceito de uso no momento da criação da string, cada entrada finalmente armazena private final char value[];. Portanto, não há bug implementado.

snipersnack
fonte
0

Apenas outro exemplo para adicionar BigDecimals. O ponto principal é que eles são imutáveis ​​e podem ser inicializados apenas no construtor. Aqui está o código:

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
fonte