Adición para BigDecimal

155

Quiero hacer algunas sumas simples con algunos valores de moneda expresados ​​en 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 no entiendo bien la BigDecimalaritmética, ver salida detrás.

Test
0
0
0

¿Puede alguien ayudarme?

Sergio del Amo
fuente

Respuestas:

275

El BigDecimales inmutable, por lo que debe hacer esto:

BigDecimal result = test.add(new BigDecimal(30));
System.out.println(result);
Vincent Ramdhanie
fuente
27
Puedo entender la confusión. Aunque se afirma que BigDecimal es inmutable, la documentación podría ser mejor. Por ejemplo, los documentos indican el método add(..): "augend - valor que se agregará a este BigDecimal". Además, decir "... devuelve un nuevo BigDecimal ..." en lugar de "... devuelve un BigDecimal ..." sería un buen toque. Tal vez solo estoy jugando, pero en mi humilde opinión, hay margen de mejora aquí :-)
pauluss86
3
Solo una nota al margen, BigDecimal no es completamente inmutable ya que no es final como String ...
Zai
@Zai Pero eso es solo un error de implementación, no por diseño. El código mantenible no debería explotar eso.
Chris Jester-Young
1
¿Y por qué la implementación de Java es un poco extraña? muchos otros idiomas simplemente usan + entre tipos de datos numéricos
sepehr
33

Parece de los documentos de Java aquí que agregar devuelve un nuevo 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
fuente
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
fuente
11

En realidad es bastante fácil. Solo haz esto:

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

Ver también: BigDecimal#add(java.math.BigDecimal)

nfechner
fuente
Es interesante que su respuesta sea idéntica a la de Maurice Perry. Si desea agregar el enlace, debería haber editado el suyo.
forresthopkinsa
En realidad, no lo copié, pero creo que ambos escribimos la misma respuesta al mismo tiempo (de todos modos, es simplemente la solución para el código dado). Solo tardé un minuto más en buscar el enlace correcto.
nfechner
Wow, eso es muy interesante!
forresthopkinsa
9

BigInteger es inmutable, debes hacer esto,

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

20

Yatish
fuente
2

También puedes hacerlo así:

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

Huellas dactilares:

A + B + C = 60000000000

Artur Krawczyk
fuente
1

Usando lambdas Java8

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

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

Esto cubre casos en los que algunos o todos los objetos de la lista son nulos.

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

Es inmutable porque almacena internamente su entrada, es decir (15) final private final BigInteger intVal; y el mismo concepto de uso en el momento de la creación de la cadena, cada entrada finalmente se almacena en private final char value[];.Así que no hay ningún error implícito.

francotirador
fuente
0

Solo otro ejemplo para agregar BigDecimals. El punto clave es que son inmutables y solo se pueden inicializar en el constructor. Aquí está el 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
fuente