Математическая операция с BigDecimal

Имею поля:

abstract class Card {
    private long serialNumber;
    private BigDecimal balance;
    private boolean credit;
    private BigDecimal debt;

Имею метод:

 public void withdraw(BigDecimal request) {
        balance -= request;
    }

Выдает ошибку, просит:

введите сюда описание изображения

Вроде все варианты попробовал, все-равно ошибка. Что ему надо?


Ответы (2 шт):

Автор решения: Aziz Umarov

BigDecimal и BigInteger оба класса имутабельны. Полученный объект изменить нельзя. Операции с объектами производятся только через методы.

  MathContext mc = new MathContext(2); // 2 precision

  bg1 = new BigDecimal("100.123");
  bg2 = new BigDecimal("50.56");

  // subtract bg1 with bg2 using mc and assign result to bg3
  bg3 = bg1.subtract(bg2, mc);
→ Ссылка
Автор решения: Владимир Карсанов

Не понимаю, за что так заминусовали вопрос. Все мы когда-то учились.

Смотрите, составной оператор присваивания:

balance -= request;

вашем случае раскрывается следующим образом:

balance = (BigDecimal) (balance - request);

Вся проблема в том, что в Java выполнение операции balance - request невозможно. С оператором "минус" могут использоваться только примитивные типы данных, а BigDecimal -- ссылочный тип.

Ваш метод долен выглядеть так:

public void withdraw(BigDecimal request) {        
    balance = balance.subtract(request);
}

И вообще привыкайте. Там где мы работаем с BigInteger и BigDecimal, операторы +-/*% не применимы. Там всё через методы: add(), substract() и т.п. Так что выражения с BigDecimal получаются очень громоздкими. Но за то вычисления точные.

→ Ссылка