Published 2022. 12. 2. 15:25

BigDecimal

  • Double, Float과 같은 부동소수점은 컴퓨터의 한계 때문에 오차가 발생한다
  • 그렇기 때문에 소수를 다루면서 값의 정확성이 중요한 경우 부동소수점 대신 자바가 제공하는 BigDecimal을 사용해야한다. 다만 기본 타입 연산에 비해 성능이 좋지 않다는 점은 유의
  • MySQL의 Decimal과 대응된다

초기화

  • 생성자를 통해 객체를 생성할 경우 인자로 문자열로 전달해야지만 정확한 값을 저장한다. 부동소수점을 전달할 경우 근사치를 저장하기에 예상과 다른 값이 저장될 수 있음
  • BigDecimal.valueOf() 정적 메소드를 통할 경우 부동소수점을 전달해도 정확한 값을 저장
val d1 = BigDecimal(0.01)   // 근사치인 0.01000000000000000020816681711721685132943093776702880859375 저장
val d2 = BigDecimal("0.01") // 0.01 저장
val d3 = BigDecimal.valueOf(0.01) // 0.01 저장 

비교

  • 자바의 경우 == 비교 연산자로 비교할 경우 주소값을 비교하기 때문에 equals()를 사용해야 했지만 코틀린의 비교 연산자는 equals()이기 때문에 비교 연산자를 사용해도 작동한다.
  • == 이외의 비교 연산자는 compareTo()로 처리되기 때문에 비교 연산자로 비교하면 된다
  • ==는 끝의 0까지 비교하지만 compareTo는 끝의 0은 생략하고 비교하므로 차이가 발생한다. ==는 문자열로 파싱한 값의 비교라고 생각하면 된다
val d1 = BigDecimal.valueOf(3.00)
val d2 = BigDecimal.valueOf(3)
val d3 = BigDecimal.valueOf(4)

println(d1 == d2)               // false
println(d1.compareTo(d2) == 0)  // true
println(d1 < d3)                // true

연산

  • 자바의 경우 메소드를 통해 연산해야했지만 코틀린은 연산자를 통해 사용하면 된다. 내부적으로 연산자 오버로딩이 되어 있는것을 추정됨
  • 나누기의 경우 반올림인 RoundingMode.HALF_EVEN이 기본 정책으로 설정되있다. 다른 정책을 사용하고 싶은 경우 devide() 메소드를 사용하면 된다
val d1 = BigDecimal.valueOf(3.00)
val d2 = BigDecimal.valueOf(1)

// add
println(d1 + d2)
// subtract
println(d1 - d2)
// multiply
println(d1 * d2)
// divide
println(d1 / d2) 

Reference

'Language > Kotlin' 카테고리의 다른 글

[Kotlin] 코루틴의 이해와 사용  (0) 2022.12.14
[Kotlin] 코루틴과 비동기  (0) 2022.12.10
[Kotlin] Lambda & High-Order Function  (0) 2022.11.21
[Kotlin] Function & Class  (0) 2022.11.17
복사했습니다!