2009-12-04 11 views
123

Desidero fare alcune somme semplici con alcuni valori di valuta espressi nel tipo BigDecimal.Aggiunta per 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); 

Ovviamente non capisco bene le BigDecimal aritmetica, vedi uscita dietro.

Test 
0 
0 
0 

Qualcuno può darmi una mano?

risposta

214

Il BigDecimal è immutabile, quindi è necessario fare questo:

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

posso capire la confusione. Anche se si afferma che BigDecimal è immutabile, la documentazione potrebbe essere migliore. Ad esempio, lo stato dei documenti per metodo 'add (..)': "augend - valore da aggiungere ** a questo ** BigDecimal.". Inoltre, dire "... restituisce un ** nuovo ** BigDecimal ..." invece di "... restituisce un BigDecimal ..." sarebbe un bel tocco. Forse sto solo facendo il pelo nell'uovo, ma IMHO c'è un margine di miglioramento qui :-) – pauluss86

+3

Solo una nota a margine, BigDecimal non è completamente immutabile in quanto non finale come String ... – Zai

+0

@Zai Ma questo è solo un bug di implementazione, non di progettazione . Il codice mantenibile non dovrebbe sfruttarlo. –

9

BigInteger è immutabile, è necessario fare questo,

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

Sembra che dalla documentazione Java here che aggiunge restituisce un nuovo 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

In realtà è piuttosto semplice. Basta fare questo:

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

Vedi anche: BigDecimal#add(java.math.BigDecimal)

+0

Interessante che la tua risposta sia identica a quella di Maurice Perry. Se vuoi aggiungere il link, dovresti aver appena modificato il suo. – forresthopkinsa

+0

In realtà, non l'ho copiato ma penso che entrambi abbiamo scritto la stessa risposta allo stesso tempo (è semplicemente la correzione per il codice dato comunque). Ho solo impiegato un minuto in più per cercare il link corretto. – nfechner

+0

Wow, è molto interessante! – 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); 

è immutabile Allucinante internamente viene memorizzato ingresso cioè (15) come final private final BigInteger intVal; e lo stesso concetto utilizzato al momento della creazione di stringhe ogni input viene infine memorizzato in private final char value[];. Quindi non vi è alcun bug impiantato.

0

Solo un altro esempio per aggiungere BigDecimals. Il punto chiave è che sono immutabili e possono essere inizializzati solo nel costruttore. Ecco il codice:

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

È anche possibile fare in questo modo:

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

Stampe:

A + B + C = 60000000000