실수는 소수점을 포함한 값을 표현하기 위한 데이터 타입이다.
실수형 데이터 타입은 소수점을 포함한 값을 표현할 수 있지만, 오차가 발생할 수 있다.
그래서 실수형 데이터 타입은 정밀도가 중요하다.
위 이미지에서 유효자릿수가 정밀도를 결정한다.
정밀도는 몇자리까지 오차없이 표현할 수 있는가를 의미한다.

위의 이미지에서는 실수형 데이터 타입이 표현할 수 없는 범위가 있다는 것을 확인할 수 있다. 실수형은 얼마나 큰 수를 표현하는가, 얼마나 0에 가깝게 표현하는가가 중요하다.(얼마나 정밀도있게 표현할 수 있는가라고도 할 수 있다.)
실수형 데이터 타입은 정밀도와 표현 범위에 한계가 있기 때문에, 컴퓨터는 실수를 일정한 규칙에 따라 나누어 저장해야 한다.

자바는 실수를 위와 같이 부호(S),지수(E), 가수(M)로 구성된 부동소수점 방식으로 값을 저장한다.
값 = (-1)^S × M × 2^E
자바는 실수를 하나의 값으로 저장하지 않고 숫자 값과 소수점 위치를 분리하여 저장한다.
0.1을 이진수로 변환하면 무한소수가 되는데, 제한된 비트로는 이를 정확히 표현할 수 없어 반올림이 발생한다.
위와 같은 이유로 부동소수점은 실제 값과 가장 가까운 근사값을 저장한다.
ex)
System.out.println(0.1 + 0.2);
결과: 0.30000000000000004
float과 double은 모두 부동소수점 방식이지만, 가수(M)와 지수(E)의 비트 수가 다르다.
double은 float보다 더 많은 비트를 사용하기 때문에 더 높은 정밀도를 제공한다.
-> 정밀도가 중요한 경우에는 double을 사용
BigDecimal은 내부적으로 수를 십진수로 저장해서 아주 작은 수과 큰 수의 연산에 대해 거의 무한한 정밀도를 보장한다.
지금은 BigDecimal에 대해 그냥 이런게 있고 돈과 소수점을 다룰 때 이걸 쓴다 정도로만 알고 있고 나중에 따로 정리하려고 한다.