Дополнение для BigDecimal

155

Я хочу сделать несколько простых сумм с некоторыми значениями валюты, выраженными в 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);

Очевидно, я не очень хорошо понимаю BigDecimal арифметику, см. Вывод позади.

Test
0
0
0

Может кто-нибудь мне помочь?

Серхио дель Амо
источник

Ответы:

275

Это BigDecimalнеизменяемый, поэтому вам нужно сделать это:

BigDecimal result = test.add(new BigDecimal(30));
System.out.println(result);
Винсент Рамдхани
источник
27
Я могу понять путаницу. Несмотря на то, что заявлено, что BigDecimal является неизменным, документация может быть лучше. Например, состояние документа для метода add(..): «augend - значение, которое будет добавлено в этот BigDecimal.». Кроме того, было бы неплохо сказать «... возвращает новый BigDecimal ...» вместо «... возвращает BigDecimal ...». Возможно, я просто придираюсь, но ИМХО здесь есть место для улучшения :-)
pauluss86
3
Просто примечание: BigDecimal не является полностью неизменным, поскольку не является окончательным, как String ...
Zai
@Zai Но это просто ошибка реализации, а не дизайн. Поддерживаемый код не должен использовать это.
Крис Шестер-Янг
1
и почему реализация Java немного странная ?! многие другие языки просто используют + между числовыми типами данных
Sepehr
33

Из документации по Java здесь видно, что add возвращает новый 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

Это на самом деле довольно легко. Просто сделай это:

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

Смотрите также: BigDecimal#add(java.math.BigDecimal)

nfechner
источник
Интересно, что ваш ответ идентичен ответу Мориса Перри. Если вы хотите добавить ссылку, вы должны были просто отредактировать его.
Форрестхопкинса 12.12.16
На самом деле, я не копировал его, но я думаю, что мы оба написали один и тот же ответ одновременно (в любом случае, это просто исправление для данного кода). Я просто потратил минуту на поиск нужной ссылки.
nfechner
Вау, это довольно интересно!
Форрестхопкинса
9

BigInteger является неизменным, вам нужно сделать это,

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

20

Yatish
источник
2

Вы также можете сделать это так:

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

Печать:

A + B + C = 60000000000

Артур Кравчик
источник
1

Использование Java8 лямбды

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

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

Это охватывает случаи, когда некоторые или все объекты в списке являются нулевыми.

DaithiG
источник
0
BigDecimal demo = new BigDecimal(15);

Он неизменен, потому что он внутренне хранит ваш ввод, т. Е. (15), как final private final BigInteger intVal; и при использовании той же концепции во время создания строки, каждый ввод, наконец, сохраняется в. Так private final char value[];что здесь нет явной ошибки.

snipersnack
источник
0

Просто еще один пример, чтобы добавить BigDecimals. Ключевым моментом является то, что они неизменяемы и могут быть инициализированы только в конструкторе. Вот код:

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());
    }
}
Паоло Леончини
источник