Ergänzung für BigDecimal

155

Ich möchte einige einfache Summen mit einigen Währungswerten in BigDecimalTyp machen.

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 die BigDecimalArithmetik nicht gut , siehe Ausgabe dahinter.

Test
0
0
0

Kann mir jemand helfen?

Sergio del Amo
quelle

Antworten:

275

Das BigDecimalist unveränderlich, also müssen Sie dies tun:

BigDecimal result = test.add(new BigDecimal(30));
System.out.println(result);
Vincent Ramdhanie
quelle
27
Ich kann die Verwirrung verstehen. Obwohl angegeben wird, dass BigDecimal unveränderlich ist, könnte die Dokumentation besser sein. In den Dokumenten heißt es beispielsweise für die Methode add(..): "augend - Wert, der diesem BigDecimal hinzugefügt werden soll ." Darüber hinaus wäre es eine nette Geste zu sagen, "... gibt ein neues BigDecimal zurück ..." anstelle von "... gibt ein BigDecimal zurück ...". Vielleicht bin ich nur ein Trottel, aber meiner Meinung nach gibt es hier Raum für Verbesserungen :-)
pauluss86
3
Nur eine Randnotiz, BigDecimal ist nicht vollständig unveränderlich, da es nicht endgültig wie String ist ...
Zai
@Zai Aber das ist nur ein Implementierungsfehler, nicht beabsichtigt. Wartbarer Code sollte das nicht ausnutzen.
Chris Jester-Young
1
und warum ist die Java-Implementierung etwas seltsam?! Viele andere Sprachen verwenden einfach + zwischen numerischen Datentypen
6.
33

Aus den Java-Dokumenten hier geht hervor, dass add ein neues BigDecimal zurückgibt:

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
quelle
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
quelle
11

Es ist eigentlich ziemlich einfach. Mach das einfach:

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)

nfechner
quelle
Interessant, dass Ihre Antwort mit der von Maurice Perry identisch ist. Wenn Sie den Link hinzufügen möchten, sollten Sie gerade seinen bearbeitet haben.
Forresthopkinsa
Eigentlich habe ich es nicht kopiert, aber ich denke, wir haben beide zur gleichen Zeit die gleiche Antwort geschrieben (es ist einfach die Lösung für den angegebenen Code). Ich habe nur eine Minute länger gebraucht, um den richtigen Link zu finden.
Nfechner
Wow, das ist ziemlich interessant!
Forresthopkinsa
9

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

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

20

Yatish
quelle
2

Sie können es auch so machen:

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

Artur Krawczyk
quelle
1

Verwenden von Java8-Lambdas

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

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

Dies gilt für Fälle, in denen einige oder alle Objekte in der Liste null sind.

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

Es ist unveränderlich, da es Ihre Eingabe intern speichert, dh (15), final private final BigInteger intVal; und dasselbe Konzept zum Zeitpunkt der Zeichenfolgenerstellung verwendet. Jede Eingabe wird schließlich in private final char value[];gespeichert. Es gibt also keinen implizierten Fehler.

Scharfschützen
quelle
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());
    }
}
Paolo Leoncini
quelle