[JAVA] 0.1 + 0.2 = 0.3이 아닌 이유

노성빈·2024년 2월 23일

JAVA

목록 보기
3/11
post-thumbnail

부동 소수점 방식

자바에서는 0.1 + 0.2 = 0.3이 아닌 0.30000000000000004가 나온다
이는 부동 소수점 방식을 사용했기 떄문에 발생하는 오차이다.

구조

32비트인 float는 부호 1bit, 지수부 8bit, 가수부 23bit로 표현된다.

부호비트

0일때 양수, 1일때 음수가 된다.

지수부

소수점의 위치를 정한다.
지수부는 8비트여서 0~255를 표현할 수 있고, 소수점을 양쪽으로 움직이기 위해서 가운데인 127을 기준으로 127보다 크면 그 차이만큼 우즉, 낮으면 좌측으로 소수점을 옮긴다.

가수부

숫자의 절댓값을 2진수로 표현한뒤 점의 왼쪽에 1자리만 남도록 밀어준다. 이 소수점은 나중에 지수부에서 위치를 다시 찾아 줄 것이다.

이유

이진수로 표현했을 때 무한으로 표현되는 실수들은 반올림을 하기 때문에 오차가 생긴다.

해결법

정수로 치환하기

소수점 자릿수 만큼 10을 곱해준 뒤 계산을 하고, 다시 그만큼 10으로 나누어주는 방법이 있다.

BigDecimal 클래스 사용

소수의 크기가 18자리를 초과한다면 BigDecimal 클래스를 사용하면 된다.
하지만 실행속도가 느려진다는 단점이 있으니 알아두자.

0개의 댓글