본문 바로가기
☕️ JAVA/🦋 Effective Java

정확한 답이 필요하다면 float와 double은 피하자 🏃‍♂️

by kukim 2022. 1. 18.

이 글은 책 이펙티브 자바 3판 Item60을 참고했습니다. 잘못된 내용이 있다면 편하게 말씀해주세요 🙏🏻

 

주제

일반적인 프로그래밍 원칙

 

결론

float와 double은 근사치이기 때문에 정확한 계산(e.g. 금융)은 맞지 않다.

정확한 계산에는 BigDecimal으로 바꾸거나 정수 타입으로 스케일을 바꾼 뒤 계산한다


float나 double는 부동 소수점의 정밀도 차이로 정확한 값 비교가 틀릴 수 있다.

이를 위해 자바에서 BigDecimal을 사용하거나 소수값을 정수로 스케일을 변경하여 ( e.g. 0.01달러 = 1센트, 1.25달러 = 125센트) 계산하자

 

    @Test
    void double_연산() {
        double d1 = 1.03;
        double d2 = 0.42;
        double result = d1 - d2;
        System.out.println(result); // 0.6100000000000001
        assertThat(result).isEqualTo(0.61); // Failed
    }

    @Test
    void BigDecimal_연산() {
        BigDecimal b1 = new BigDecimal("1.03");
        BigDecimal b2 = new BigDecimal("0.42");
        String result = b1.subtract(b2).toString();
        System.out.println(result);	//0.61
        assertThat(result).isEqualTo("0.61"); // pass
    }

    @Test
    void 정수타입변환하여연산() {
        int n1 = (int) (1.03 * 100);
        int n2 = (int) (0.42 * 100);
        int result = n1 - n2;
        System.out.println(result);	// 61
        assertThat(result).isEqualTo(61); // Pass
    }

 

댓글