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?

Respostas:


275

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

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

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

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

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)


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

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

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


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.


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.


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());
    }
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.