[Kotlin] BigDecimal

Subeen·2023년 11월 30일
0

Kotlin 문법

목록 보기
9/23

덧셈 연산을 구현하는 중 입력값을 Double로 형변환하여 연산을 진행하였다. 연산 결과가 원하는 대로 곧 잘 나왔지만 0.1 + 0.2를 했을 때 0.30000000000000004라는 결과가 나왔다. 소수점을 다룰 때 부동소수점 오류로 인해 소수점이 제대로 표현되지 않는 문제가 발생하며 이런 문제를 예방하고자 BigDecimal을 사용한다고 한다. 오늘은 BigDecimal에 대해 정리 해보겠다.

float와 double의 문제점

val num1: Double = 0.1
val num2: Double = 0.2
println(num1 AbstractIterator num2)  // 0.30000000000000004
  • float와 double은 정확한 값이 아닌 근삿값을 담고 있기에 부동소수 타입의 문제가 발생한다.
  • float와 double은 부동소수점 표현방식으로 구현 되었는데 부동소수점 표현방식은 고정소수점 표현방식에 비해 표현범위가 더 넓지만 2진수를 사용하므로 소수를 표현할 때 오차가 발생한다.

BigDecimal이란?

  • BigDecimal은 불변의 성질을 띄며 임의 정밀도와 부호를 지니는 10진수이다.
  • BigDecimal은 객체 간의 연산마다 새로운 객체를 생성하는데 float나 double과 같은 기본 타입에 비해 속도가 느리다.
  • 돈계산이나 소수점을 다룬다면 BigDecimal을 사용해야 한다.

BigDecimal 생성

  • BigDecimal()을 사용할 때는 인자값을 문자열로 넘겨 생성한다.
  • 문자열을 넘겨주지 않을 경우 부동소수점 오류가 그대로 나타나게 된다.
val bigDecimal1 = BigDecimal("100.125")  // 문자열로 넘겨줌
println(bigDecimal1)
    
val bigDecimal2 = BigDecimal.valueOf(100.125)  // 숫자로 넘겨줌
println(bigDecimal2)

BigDecimal 연산

  • 0.1 + 0.2 연산을 했을 때 double형에서는 0.30000000000000004라는 결과를 얻었는데 BigDecimal을 사용하니 0.3이라는 올바른 결과가 나오는 것을 확인했다.
val decimal1 = BigDecimal("0.1")
val decimal2 = BigDecimal("0.2")
println(decimal1 + decimal2)  // 0.3

val double1: Double = 0.1
val double2: Double = 0.2
println(double1 + double2)  // 0.30000000000000004
val decimal1 = BigDecimal("100.15")
val decimal2 = BigDecimal("10.5")

// 덧셈 연산
println(decimal1 + decimal2)
println(decimal1.plus(decimal2))

// 뺄셈 연산
println(decimal1 - decimal2)
println(decimal1.minus(decimal2))

// 곱셈 연산
println(decimal1 * decimal2)
println(decimal1.times(decimal2))

// 나눗셈 연산
println(decimal1 / decimal2)
println(decimal1.div(decimal2))

// 나머지 연산
println(decimal1 % decimal2)
println(decimal1.rem(decimal2))

BigDecimal 비교

  • BigDecimal은 compareTo라는 메소드를 사용하여 비교할 수 있다.
    decimal1.compareTo(decimal2) 기준 decimal1이 크면 1을 반환하고 작으면 -1을 반환한다. decimal2과 같을 경우에는 0을 반환한다.
val decimal1 = BigDecimal("100.15")
val decimal2 = BigDecimal("10.5")

val compare = decimal1.compareTo(decimal2)
println(compare)  // decimal1이 크면 1 같으면 0 작으면 -1

참조
BigDecimal
BigDecimal

profile
개발 공부 기록 🌱

0개의 댓글