2009-12-04 15 views
123

Quiero hacer algunas sumas simples con algunos valores de moneda expresados ​​en BigDecimal tipo.Adición para BigDecimal

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, yo no entiendo bien las BigDecimal aritmética, ver la salida atrás.

Test 
0 
0 
0 

¿Alguien me puede ayudar?

Respuesta

214

El BigDecimal es inmutable por lo que necesita para hacer esto:

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

puedo entender la confusión. A pesar de que se afirma que BigDecimal es inmutable, la documentación podría ser mejor. Por ejemplo, el estado de los documentos para el método 'add (..)': "augend - valor a 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 curioseando, pero en mi humilde opinión hay margen de mejora aquí :-) – pauluss86

+3

Como nota al margen, BigDecimal no es completamente inmutable ya que no es final como String ... – Zai

+0

@Zai Pero eso es solo un error de implementación, no por diseño . El código que se puede mantener no debe explotar eso. –

9

BigInteger es inmutable, lo que necesita hacer esto,

BigInteger sum = test.add(new BigInteger(30)); 
    System.out.println(sum); 
15
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); 
27

Parece que a partir de los documentos de Java here ese complemento 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); 
10

En realidad es bastante fácil. Sólo hacer 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)

+0

. 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

+0

En realidad, no lo copié, pero creo que ambos escribimos la misma respuesta al mismo tiempo (simplemente es la solución para el código dado). Me tomó un minuto más buscar el enlace correcto. – nfechner

+0

Guau, ¡eso es bastante interesante! – forresthopkinsa

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 
2
BigDecimal no = new BigDecimal(10); //you can add like this also 
no = no.add(new BigDecimal(10)); 
System.out.println(no); 

1
BigDecimal demo = new BigDecimal(15); 

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

0

Simplemente 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()); 
    } 
} 
0

También puede hacerlo de esta manera:

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

Prints:

A + B + C = 60000000000