μ •λ°€ μ—°μ‚°μ—λŠ” BigDecimal 을 μ‚¬μš©ν•˜μž

2024. 4. 24. 11:17Β·πŸ“‚ programming-language/java

 μ»΄ν“¨ν„°λŠ” μ‹€μˆ˜λ₯Ό ν‘œν˜„ν•˜κΈ° μœ„ν•œ 방법은 λ‹€μ–‘ν•˜μ§€λ§Œ λŒ€ν‘œμ μœΌλ‘œ κ³ μ • μ†Œμˆ˜μ (fixed point) κ³Ό λΆ€λ™ μ†Œμˆ˜μ (floating point) 이닀. κ³ μ • μ†Œμˆ˜μ μ€ 10μ§„μˆ˜λ₯Ό 2μ§„μˆ˜μ˜ κ±°λ“­ 제곱 ν•©μœΌλ‘œ ν‘œν˜„ν•΄ κ·ΈλŒ€λ‘œ λΉ„νŠΈμ— λ‹΄μ•„ μ‚¬μš©ν•˜κ³ , 뢀동 μ†Œμˆ˜μ μ€ 2μ§„μˆ˜μ˜ ν‘œν˜„ 방식과 λΉ„νŠΈλ₯Ό μ‚¬μš©ν•˜λŠ” 체계가 λ‹€λ₯΄λ©° κ°€μž₯ 널리 μ“°μ΄λŠ” ν‘œμ€€μ€ IEEE754 이닀. IEEE754 λŠ” normalization, μ§€μˆ˜λΆ€ bias μΆ”κ°€ 과정이 ν¬ν•¨λœλ‹€. μžλ°”μ˜ float λŠ” IEEE754 λ°©μ‹μœΌλ‘œ κ΄€λ¦¬λ˜λ©°, 1bitλŠ” λΆ€ν˜Έ(sign), 8bitλŠ” μ •μˆ˜λΆ€(exponent), 23bitλŠ” κ°€μˆ˜λΆ€(mantissa)  둜 μ‹€μˆ˜λ₯Ό κ΄€λ¦¬ν•œλ‹€.

κ³ μ • μ†Œμˆ˜μ  (좜처 : CS50 - κ³ μ • μ†Œμˆ˜μ )
뢀동 μ†Œμˆ˜μ  (좜처 : CS50 - κ³ μ • μ†Œμˆ˜μ )

 

 

 ν•˜μ§€λ§Œ 이 λ°©μ‹μ—λŠ” 단점이 μ‘΄μž¬ν•œλ‹€. κ³ μ • μ†Œμˆ˜μ , 뢀동 μ†Œμˆ˜μ  μ‹€μˆ˜ 뢀뢄에 κ΄€ν•œ λΉ„νŠΈλ₯Ό λͺ¨λ‘ μ‚¬μš©ν•˜λ©΄ λ‚˜λ¨Έμ§€ λΉ„νŠΈλŠ” 버리기 λ•Œλ¬Έμ— μ •ν™•ν•œ κ°’ λŒ€μ‹  κ·Όμ‚¬μΉ˜ κ°’λ§Œ ν‘œν˜„ν•œλ‹€. 10μ§„μˆ˜λ₯Ό 2μ§„μˆ˜λ‘œ ν‘œν˜„ν•˜λŠ” κ³Όμ •μ—μ„œ λ¬΄ν•œ μ†Œμˆ˜ λ˜λŠ” κ°€μˆ˜ 뢀뢄을 μ΄ˆκ³Όν•˜λŠ” μ†Œμˆ˜κ°€ λ³€ν™˜λ˜λ©΄ λΉ„νŠΈ μ™Έ 뢀뢄은 사라져 κ·Όμ‚¬μΉ˜ κ°’λ§Œ ν‘œν˜„λ˜κΈ° λ•Œλ¬Έμ— κΈˆμœ΅κΆŒμ΄λ‚˜ 곡학 계산과 같은 정밀도가 높은 연산이 ν•„μš”ν•œ λΉ„μ¦ˆλ‹ˆμŠ€μ—μ„œλŠ” λΆ€μ ν•©ν•˜λ‹€.

class Main {
	public static void main(String[] args) {
    	System.out.println(1.00 - 9 * 0.10); // 0.09999999999999998
    }
}

 

 

effective java μ—μ„œλŠ” 3κ°€μ§€ μš”μ†Œλ“€μ„ ꢌμž₯ν•œλ‹€.

  1. μ†Œμˆ˜μ μ˜ μ •λ°€ν•œ 연산을 μœ„ν•΄μ„œ BigDecimal 을 μ‚¬μš©ν•˜μž.
  2. μ •μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 경우, int(21μ–΅ μ΄ν•˜), long(90κ²½ μ΄ν•˜) 을 μ‚¬μš©ν•˜μž.
  3. float κ³Ό double 을 μ‚¬μš©ν•  λ•ŒλŠ” == 을 μ‚¬μš©ν•˜μ§€ 말자.

 

그리고 BigDecimal 을 μ‚¬μš©ν•  λ•ŒλŠ” μ•„λž˜λ₯Ό μ£Όμ˜ν•˜μž!

  1. BigDecimal 을 생성할 λ•Œ, double 을 μ‚¬μš©ν•΄μ„œ μƒμ„±ν•˜μ§€ 말자.
  2. μ†Œμˆ˜μ μ„ ν‘œν˜„ν•œλ‹€λ©΄ RoundingMode 와 scale λ₯Ό κ³ λ €ν•΄μ„œ μ‚¬μš©ν•˜μž.

 

Reference

  • CS50 - κ³ μ • μ†Œμˆ˜μ (fixed point)κ³Ό 뢀동 μ†Œμˆ˜μ (floating point)
  • [μ§€λ§ˆμΌ“] BigDecimal A to Z: μ •ν™•ν•œ 계산을 μœ„ν•œ 숫자 처리 클래슀
  • μ΄νŽ™ν‹°λΈŒ μžλ°” Effective Java 3/E (μ•„μ΄ν…œ 60. μ •ν™•ν•œ 닡이 ν•„μš”ν•˜λ‹€λ©΄ float와 double은 ν”Όν•˜λΌ)

'πŸ“‚ programming-language > java' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

νΌμ‚¬λ“œ νŒ¨ν„΄(Facade Pattern)  (0) 2024.07.08
μ»€λ§¨λ“œ νŒ¨ν„΄(command pattern)  (0) 2024.07.08
μ±…μž„ 연쇄 νŒ¨ν„΄ (chain of responsibility pattern)  (1) 2024.07.05
싱글톀 νŒ¨ν„΄(singleton pattern)  (0) 2024.07.03
Garbage Collector simple summary  (0) 2024.03.04
'πŸ“‚ programming-language/java' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • μ»€λ§¨λ“œ νŒ¨ν„΄(command pattern)
  • μ±…μž„ 연쇄 νŒ¨ν„΄ (chain of responsibility pattern)
  • 싱글톀 νŒ¨ν„΄(singleton pattern)
  • Garbage Collector simple summary
cooper25
cooper25
  • cooper25
    dev cooper
    cooper25
  • 전체
    였늘
    μ–΄μ œ
    • λΆ„λ₯˜ 전체보기 (84)
      • πŸ“‚ backend (34)
        • spring (19)
        • architecture (10)
        • test (5)
      • πŸ“‚ computer-science (5)
      • πŸ“‚ programming-language (12)
        • java (12)
      • πŸ“‚ infra (9)
        • mysql (4)
        • redis (2)
        • message-queue (3)
      • πŸ“‚ cloud (2)
        • aws (2)
      • πŸ“‚ frontend (1)
        • react (0)
      • πŸ“‚ education & lecture (16)
        • 인프라 곡방 (11)
        • ν•­ν”Œ λ°±μ—”λ“œ 7κΈ° (5)
      • πŸ“‚ ai (1)
        • claude (1)
      • πŸ“‚ etc (2)
        • 회고 (1)
        • 컨퍼런슀 (1)
  • λΈ”λ‘œκ·Έ 메뉴

    • ν™ˆ
    • νƒœκ·Έ
    • λ°©λͺ…둝
  • 링크

  • 곡지사항

  • 인기 κΈ€

  • νƒœκ·Έ

    μŠ€ν”„λ§μΊ ν”„ ν›„κΈ°
    회고
    spring AOP
    인프라곡방
    nGrinder
    spring camp 2025
    spring-batch
    JPA
    mysql
    UUID
    가상 λ©΄μ ‘ μ‚¬λ‘€λ‘œ λ°°μš°λŠ” λŒ€κ·œλͺ¨ 섀계
    Redisson
    AWS
    gof
    λ™μ‹œμ„±
    react
    ν•­ν•΄ν”ŒλŸ¬μŠ€
    spring
    데이터 쀑심 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 섀계
    kafka
  • 졜근 λŒ“κΈ€

  • 졜근 κΈ€

  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.6
cooper25
μ •λ°€ μ—°μ‚°μ—λŠ” BigDecimal 을 μ‚¬μš©ν•˜μž
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”