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?

Antworten:


275

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

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

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

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

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)


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

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

3
BigDecimal no = new BigDecimal(10); //you can add like this also
no = no.add(new BigDecimal(10));
System.out.println(no);

20


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


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.


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.


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());
    }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.