1개의 부호 비트와 31개의 값 표현 비트로 이루어져 있다.
최대값은 2^32-1
최소값은 -2^32
의문점 : 1개가 부호고 31개가 값이면 -(2^32-1)~2^32-1까지 아니야??
-> 2의 보수를 이용하여 저장하기때문에 최소값이 -2^32까지이다.


장점 : 사람이 볼 때 MSB만 보고 양수, 음수를 파악할 수 있어 직관적이다.
단점 : 0을 표현하는 방법이 2가지가 있다. 셈을 할 때 고려해야 할 것이 많아지고 회로가 복잡해진다.
2의 보수 사용(1100)
ex1)
ex2)
장점 : 1의 보수에 1을 더하면 음수 값을 얻을 수 있다. 덧셈만으로 뺄셈을 구현할 수 있어 회로가 단순해진다. 1의 보수의 단점이 모두 해결된다. ( 0이 2개인 문제, 캐리 값에 따라 셈을 추가로 해줘야 하는 문제 )
1개의 부호비트와 8개의 지수비트 23개의 가수비트로 이루어져 있다.
1개의 부호비트와 11개의 지수비트 52개의 가수비트로 이루어져 있다.
형태로 수를 저장하는 방법.
지수부분은 -127의 bias를 갖고, 가수부분은 항상 1로 시작한다.
최댓값은
최솟값은 (MIN_VALUE 이지만 절대적인 최솟값이 아니라 가장 작은 표현 단위)
※ 예외사항
지수부분은 00000001부터 11111110까지만 사용한다 (-126~127)
- 255는 INF와 NaN을 표현한다.
11111111에서 가수부분이 0이면 INF, 0이아니면 NaN- 0은 0을 정교하게 표현하기 위해 사용한다.
기존의 가수부는 1로 시작하기 때문에 0표현이 불가능한데, 이를 위해 00000000의 경우에는 가수부분이 0부터 시작한다.

0.1을 이진수로 표현하면 다음과 같이 반복되는 이진수가 됩니다:

즉, 0.1을 이진수로 정확하게 표현하는 것은 불가능하며, 항상 일정한 비율로 반복되는 값이 됩니다.
따라서 위와 같은 이유로 double의 0.1과 0.2를 더하면 0.3이 아닌값이 된다.


정수로 변환
10의 거듭제곱을 곱해서 정수로 변환해놓고 사용한다.
BigDecimal 사용
import java.math.BigDecimal;
public class BigDecimalArithmetic {
public static void main(String[] args) {
BigDecimal num1 = new BigDecimal("100.25");
BigDecimal num2 = new BigDecimal("99.75");
// 덧셈
BigDecimal sum = num1.add(num2);
System.out.println("합: " + sum); // 200.00
}
}
}