[에러노트] 22.11.27 BigDecimal 함수 첫 사용기

hyewon jeong·2022년 12월 27일
0

에러노트

목록 보기
3/46

이전 사용한 블로그 TIL 펌함


1.문제 발생 점 :

은행계좌 코드 만들면서 , 처음에는 금액을 int형을 사용하다가 int형은 근사값이여서 금액을 처리할때는 정확한 BigDecimal () 함수를 사용한다고 합니다.

그래서 다시 int -> BicDecimal 형으로 바꾸는 과정에서

코드상에는 문제가 없어 Main 실행결과

입금, 출금 후 금액이 0원이란 오류를 발견했습니다.

2. 문제점 :

BigDemal() 함수는 일반전인 + , - 연산기호를 사용할 수 없고 별도의 함수가 있어서 였고

 BigDecimal result = this.balance.add(amount);  // int balance +=  amount;

이렇게 우측은 BigDecimal 함수에 맞게 변경해주었습니다.

하지만 입출금후 잔금이 0원이다????

그건 바로 !!! 왼쪽의 함수 문제였습니다. !!!

BigDecimal result 은 지역(로컬)변수이기 때문에 한번 입금 및 출금후 사라지는 변수 입니다.

그래서 0원이 됩니다.

3. 해결 :

이 문제를 해결하기 위해 클래스 변수인 this. Balance 를 사용하였습니다.

    public BigDecimal deposit(BigDecimal amount) {
        this.balance = this.balance.add(amount);  // int balance +=  amount;
        addHistory(ETradeType.DEPOSIT, amount, this.balance, ownerName);
        return amount;
    }

클래스 중 Account 클래스

package bank.controller;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.time.OffsetDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Account {
    private String ownerName;
    private String accountNumber;
    private BigDecimal balance;
    private String bankName;
    private List<History> histories;

    public Account(String ownerName, String accountNumber, String bankName) {
        this.ownerName = ownerName;
        this.accountNumber = accountNumber;
        this.balance = new BigDecimal(0);
        this.bankName = bankName;
        this.histories = new ArrayList<>();
    }

    public String getOwnerName() {
        return this.ownerName;
    }

    public String getAccountNumber() {
        return accountNumber;
    }

    public String getAccountNumberWithHypen() {
        StringBuilder hypenAttacher = new StringBuilder();
        hypenAttacher.append(accountNumber.substring(0, 3));
        hypenAttacher.append("-");
        hypenAttacher.append(accountNumber.substring(3, 6));
        hypenAttacher.append("-");
        hypenAttacher.append(accountNumber.substring(6, accountNumber.length()));

        return hypenAttacher.toString();
    }

    public BigDecimal getBalance() {
        return this.balance;
    }

    public String getBankName() {
        return this.bankName;
    }

    public void addHistory(ETradeType type, BigDecimal amount, BigDecimal balance, String traderName) {
        History history = new History(OffsetDateTime.now(), this.accountNumber, type, amount, balance, traderName);
        histories.add(history);
    }

    public String printAllHistoriesOrNull() {
        StringBuilder historyBuilder = new StringBuilder();
        DecimalFormat decimalFormatter = new DecimalFormat("0.##");

        for (int i = 0; i < histories.size(); i++) {
            History singleHistory = histories.get(i);

            historyBuilder.append(String.format("%d. %s, %s, ", i + 1, singleHistory.getTraderName(),
                    singleHistory.getTypeByString()));
            // 만약 거래 금액이 0보다 크다면!
            if (singleHistory.getAmount().compareTo(BigDecimal.ZERO) > 0) {
                historyBuilder.append(String.format("+%s원", decimalFormatter.format(singleHistory.getAmount())));
            } else {
                historyBuilder.append(String.format("%s원", decimalFormatter.format(singleHistory.getAmount())));
            }

            historyBuilder.append(String.format("[%s]%s", singleHistory.getTransactionDate(), System.lineSeparator()));
        }

        return historyBuilder.toString();
    }

    public String printHistory(int index) {
        StringBuilder historyBuilder = new StringBuilder();
        DecimalFormat decimalFormatter = new DecimalFormat("0.##");

        History targetHistory = histories.get(index - 1);
        historyBuilder.append(String.format("%s%s", targetHistory.getTransactionDate(), System.lineSeparator()));
        historyBuilder.append(String.format("거래금액: %s%s", decimalFormatter.format(targetHistory.getAmount()),
                System.lineSeparator()));
        historyBuilder.append(String.format("거래후 잔액: %s%s", decimalFormatter.format(targetHistory.getBalance()),
                System.lineSeparator()));
        historyBuilder.append(String.format("거래유형: %s", targetHistory.getTypeByString()));

        return historyBuilder.toString();
    }

    public void editAccount(String newOwnerName, String newAccountNumber, String newBankName) {
        this.ownerName = newOwnerName;
        this.accountNumber = newAccountNumber;
        this.bankName = newBankName;
    }

    public BigDecimal withdraw(BigDecimal amount) {
        if (this.balance.compareTo(amount) < 0) {
             return BigDecimal.ZERO;
        } else {
            this.balance = this.balance.subtract(amount);
            addHistory(ETradeType.WITHDRAW, amount, this.balance, ownerName);
            return amount;
        }
    }


//    public BigDecimal deposit(BigDecimal amount) {
//        this.balance = this.balance.add(amount);
//        addHistory(ETradeType.DEPOSIT, amount, this.balance, ownerName);
//        return amount;
//    }


    public BigDecimal deposit(BigDecimal amount) {
        this.balance = this.balance.add(amount);  // int balance +=  amount;
        addHistory(ETradeType.DEPOSIT, amount, this.balance, ownerName);
        return amount;
    }
}

profile
개발자꿈나무

0개의 댓글