Dodatek do BigDecimal

155

Chcę zrobić kilka prostych sum z pewnymi wartościami walutowymi wyrażonymi BigDecimalczcionką.

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

Oczywiście nie rozumiem dobrze BigDecimalarytmetyki, zobacz wyniki za.

Test
0
0
0

Czy ktoś może mi pomóc?

Sergio del Amo
źródło

Odpowiedzi:

275

BigDecimalJest niezmienna, więc trzeba to zrobić:

BigDecimal result = test.add(new BigDecimal(30));
System.out.println(result);
Vincent Ramdhanie
źródło
27
Rozumiem to zamieszanie. Mimo że stwierdzono, że BigDecimal jest niezmienny, dokumentacja mogłaby być lepsza. Na przykład stan dokumentacji dla metody add(..): „augend - wartość do dodania do tego BigDecimal.”. Ponadto powiedzenie „… zwraca nowy BigDecimal…” zamiast „… zwraca BigDecimal…” byłoby miłym akcentem. Być może jestem tylko czubkiem, ale IMHO jest tu miejsce na ulepszenia :-)
pauluss86
3
Na marginesie, BigDecimal nie jest całkowicie niezmienny, ponieważ nie jest ostateczny jak String ...
Zai
@Zai Ale to tylko błąd implementacji, a nie projekt. Utrzymywany kod nie powinien tego wykorzystywać.
Chris Jester-Young
1
i dlaczego implementacja Javy jest trochę dziwna ?! wiele innych języków po prostu używa
znaku
33

Wygląda na to, że z dokumentacji Java tutaj, która add zwraca nowy 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);
Ankur Goel
źródło
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
źródło
11

Właściwie jest to raczej łatwe. Po prostu zrób to:

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

Zobacz też: BigDecimal#add(java.math.BigDecimal)

nfechner
źródło
Ciekawe, że twoja odpowiedź jest identyczna z odpowiedzią Maurice'a Perry'ego. Jeśli chcesz dodać link, powinieneś po prostu edytować jego.
forresthopkinsa
Właściwie nie skopiowałem go, ale myślę, że oboje napisaliśmy tę samą odpowiedź w tym samym czasie (i tak jest to po prostu poprawka dla podanego kodu). Znalezienie prawidłowego linku zajęło mi minutę dłużej.
nfechner
Wow, to całkiem interesujące!
forresthopkinsa
9

BigInteger jest niezmienny, musisz to zrobić,

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

20

Yatish
źródło
2

Możesz to również zrobić w ten sposób:

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

Wydruki:

A + B + C = 60000000000

Artur Krawczyk
źródło
1

Korzystanie z lambd Java8

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

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

Obejmuje to przypadki, w których niektóre lub wszystkie obiekty na liście są puste.

DaithiG
źródło
0
BigDecimal demo = new BigDecimal(15);

Jest niezmienny, ponieważ wewnętrznie przechowuje dane wejściowe, tj. (15), jak final private final BigInteger intVal; i ta sama koncepcja używana w czasie tworzenia łańcucha każde wejście ostatecznie przechowuje się w private final char value[];. Więc nie ma zaimplementowanego błędu.

snipersnack
źródło
0

Kolejny przykład do dodania BigDecimals. Kluczową kwestią jest to, że są one niezmienne i można je zainicjować tylko w konstruktorze. Oto kod:

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
źródło