2009-12-04 7 views
123

Ich möchte einige einfache Summen mit einigen Währungswerten in BigDecimal Typ ausgedrückt.Addition für 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); 

Offensichtlich verstehe ich nicht gut, die BigDecimal arithmetics, Ausgang hinter sehen.

Test 
0 
0 
0 

Kann mir jemand helfen?

Antwort

214

Die BigDecimal ist unveränderlich, so dass Sie dies tun müssen:

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

kann ich verstehen Die Verwirrung. Obwohl BigDecimal unveränderlich ist, könnte die Dokumentation besser sein. Beispiel: Der Dokumentstatus für die Methode 'add (..)': "augend - Wert, der zu ** BigDecimal hinzugefügt werden soll.". Außerdem würde "... gibt ein ** neues ** BigDecimal ..." anstelle von "... gibt ein BigDecimal ..." eine nette Geste sein. Vielleicht bin ich nur pingelig, aber IMHO gibt es hier Raum für Verbesserungen :-) – pauluss86

+3

Nur eine Randnotiz, BigDecimal ist nicht komplett unveränderlich wie es nicht endgültig wie String ... – Zai

+0

@Zai Aber das ist nur ein Implementierungsfehler, nicht von Design . Wartbarer Code sollte das nicht ausnutzen. –

9

BigInteger ist unveränderlich, Sie müssen dies tun,

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

Es sieht aus wie aus der Java-Dokumentation here Dieser Zusatz gibt ein neues BigDecimal zurück:

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

Es ist eigentlich ziemlich einfach. Genau dies tun:

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

Siehe auch: BigDecimal#add(java.math.BigDecimal)

+0

Interessant, dass Ihre Antwort identisch mit Maurice Perry ist. Wenn Sie den Link hinzufügen möchten, sollten Sie nur seinen bearbeiten. – forresthopkinsa

+0

Eigentlich habe ich es nicht kopiert, aber ich denke, wir haben beide die gleiche Antwort zur gleichen Zeit geschrieben (es ist einfach die Korrektur für den gegebenen Code). Ich brauchte nur eine Minute länger, um den richtigen Link zu finden. – nfechner

+0

Wow, das ist ziemlich interessant! – 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 ist unveränderlich beacuse es intern speichern Sie Eingabe dh (15) als final private final BigInteger intVal; und das gleiche Konzept verwenden zum Zeitpunkt der String-Erstellung jeden Eingang schließlich in private final char value[];. So gibt es keine implemented Bug.

0

Nur ein weiteres Beispiel zum Hinzufügen BigDecimals. Der entscheidende Punkt ist, dass sie unveränderlich sind und nur im Konstruktor initialisiert werden können. Hier ist der Code:

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

Sie können auch tun es wie folgt aus:

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

Drucke:

A + B + C = 60000000000