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?

Odpowiedzi:


275

BigDecimalJest niezmienna, więc trzeba to zrobić:

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

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

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

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)


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

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

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


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.


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.


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());
    }
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.