키보드워리어

【자바】부동소수점 연산 본문

JAVA/입문

【자바】부동소수점 연산

꽉 쥔 주먹속에 안경닦이 2022. 11. 21. 15:20
728x90

 

BigDecimal 클래스

 

왜 자바 프로그래밍에서 연산을 사용할 때에는 기본형으로 double이나 float이 아닌 정수형 int를 쓰는 걸까요?

그 이유는 정확한 계산을 필요로 하는 수학이나, 경제 분야에서 이러한 계산 오류가 나오면 큰일 나기 때문입니다.

 

부동소수점 오류현상
부동소수점 오류현상

JSHELL로 부동소수점 계산을 해보면, 실제 값은 68.79129876이어야 하는 값에서

계산이 잘못된 것을 확인해보실 수 있습니다.

 

 

이러한 문제를 해결하기 위하여 BigDecimal 메서드를 소개합니다.

 

BigDecimal클래스 소개
BigDecimal 클래스 소개

 

※b1+b2 이런 식으로 계산하지 않고. add 메서드를 씁니다!

 

BigDecimal사용하는법
BigDecimal 사용하는법

 

BigDecimal(큰 소수점) 클래스는 정확한 계산을 해주어요.

 

여기서 중요한 점은 BigDecimal 클래스는 불변하는 변수를 만들기 때문에 한번 생성하면

변경 불가능하다는 것을 참고해주세요!

 

불변하는 변수: 한번 정해진 값을 되돌릴 수 없음

변하는 변수: 그때그때마다 값을 바꾸면 됨

 

변경 불가능한 값은 이후에 문자열과 wrapper 클래스 때 더 다루겠습니다.

지금 기억할 것은 변경 불가능한 클래스는 값을 딱 한 번만 지정할 수 있다는 겁니다.

 

 

참고로 이렇게 [tab]을 누르면 내가 할 수 있는 메서드가 무엇이 있는지 볼 수 있어요.

BigDecimal클래스가 할 수 있는 목록
BigDecimal클래스가 할 수 있는 것들

그리고 BigDecimal 클래스는 string형으로 값을 입력해주어야 정확한 값을 얻을 수 있습니다.

(인자 값에 ""추가할 것!)

 

 

 

BigDecimal 퍼즐 - Integer형 추가해보기

 

int형을 BigDecimal클래스로 어떻게 사용할까
BigDecimal클래스 생각할 문제 - int형

 

BigDecimal 메서드는 String 타입이기 때문에 int 형은 추가할 수 없답니다.

 

 

이럴 때 해결방법은 아래와 같습니다.

 

int형 BigDecimal클래스로 써보기
int형 변수를 BigDecimal클래스로 써보기

 위와 같이 int형 i를 BigDecimal로 씌워서 변환시키면 Divide, multiply 모두 같은 메커니즘으로 사용해볼 수 있겠네요.

 

BigDecimal 연습문제 - 단리 계산

 

아래와 같이 단리 계산하는 문제를 내보겠습니다. 아래 코드를 살펴보고 SimpleInterestCalculator 클래스를 만들어보세요!

퀴즈
단리계산 퀴즈

 

주석
단리계산 - 주석

이것은 단리를 계산해주는 주석입니다. 참고해주세요.

 

 

 

Package java.lang.*
public class SimpleInterestCalculator {
	BigDecimal principal; // 원리
	BigDecimal interest; // 이자율

	public SimpleInterestCalculator(String principal, String interest) { // 생성자는 원리와 이자율을 무조건 넣어주어야함
		this.principal = new BigDecimal(principal); // 원리를 BigDecimal에 넣어줌
		this.interest = new BigDecimal(interest).divide(new BigDecimal(100)); // interest는 100을 나누어주어야함
	}
public BigDecimal calculateTotalValue(int noOfYears) {
		// principal + principal * interest * noOfYears
		BigDecimal totalValue = principal.add( //더하기, 곱하기 메소드 쓰임
		principal.multiply(interest.
		multiply(new BigDecimal(noOfYears)))); //정수형 noOfYears는 BigDecimal로 바꾸어주어야함
		return totalValue;
	}

}


public class SimpleInterestCalculatorRunner {

	public static void main(String[] args) {
		SimpleInterestCalculator calculator = new SimpleInterestCalculator("4500.00", “7.5");
//원금과 이자율을 생성자로 만들어줌.
		BigDecimal totalValue = calculator.calculateTotalValue(5); //연도를 작성함
		System.out.println(totalValue);
	}

}

 

import

 

참고로 import란 다른 패키지로부터 클래스를 사용하는 소스파일들을 부를 때 쓰는 표현입니다.

 

그래서 SimpleInterCalculation클래스와 SimpleInterCalculationRunner 클래스는 import로 java.math.BigDecimal를 사용한 겁니다.

 

package java.lang.*

 

Package java.lang.* 은 자동으로 가져옵니다.

접미사.*는 자바 lang패키지의 모든 클래스를 가져온다는 걸 나타냅니다.

 

728x90