컴퓨터의 실수 표현 방식은 2진수
정수의 경우 2진수로 표현하기 쉽지만, 실수를 2진수로 표현하는 건 복잡
실수를 표현하는 방식
고정소수점 방식은 제한된 자릿수로 인해 표현할 수 있는 범위가 매우 작기 때문에 부동소수점 방식이 널리 사용됨
부동소수점의 오차
- 고정소수점 방식보다 표현할 수 있는 수의 범위는 늘지만, 오차가 존재
- 무한소수, 순환소수의 경우 표현할 수 있는 비트 수를 넘어가게 되면 손실되는 부분이 생기기 때문
- 부동소수점 오차 해결을 위해서는 BigDecimal 클래스 사용
double a = 0.1, b = 0.2; // ⚠️ 오차가 생김 double c = a + b; // 0.30000000000000004 boolean bool = 0.1 + 0.2 == 0.3; // false
자료형 | 크기 |
---|---|
float | 4바이트 |
double | 8바이트 |
double
은 float
보다 단순히 범위가 넓은 것이 아니라, 보다 정밀하게 표현 가능// float의 최대값과 최소값
float fMin = -Float.MAX_VALUE; // -3.4028235E38
float fMax = Float.MAX_VALUE; // 3.4028235E38
// double의 최대값과 최소값
double dMin = -Double.MAX_VALUE; // -1.7976931348623157E308
double dMax = Double.MAX_VALUE; // 1.7976931348623157E308
// 최소 절대값
float fAbsMin = Float.MIN_VALUE; // 1.4E-45
double dAbsMin = Double.MIN_VALUE; // 4.9E-324
// ⭐ double이 범위도 넓고, 정밀도도 높음 확인
boolean bool1 = Float.MAX_VALUE < Double.MAX_VALUE; // true
boolean bool2 = Float.MIN_VALUE > Double.MIN_VALUE; // true
float
는 뒤에 f
또는 F
를 붙여 표현float flt1 = 3.14f;
double dbl1 = 3.14;
float
에는 double
을 담을 수 없음(반대는 가능)float flt2 = dbl1; // ❌
double dbl2 = flt1;
float
에 long
의 값 담을 수 있음long lng1 = 123;
float flt3 = lng1; // 123.0
double dbl3 = lng1; // 123.0
long lng2 = Long.MAX_VALUE; // 9223372036854775807
// ⭐ 큰 수(정확히 표현가능한 한도를 넘어서는)일 경우
// 가능한 최대 정확도로
float flt4 = lng2; // 9.223372E18
double dbl4 = lng2; // 9.223372036854776E18
float
끼리의 연산은 float
를 반환하지만 float
와 double
의 연산은 double
반환// float끼리의 연산은 float 반환
float flt03 = flt01 + flt02;
// float과 double의 연산은 double 반환
float flt04 = (flt01 + dbl01); // ❌
int int1 = 5;
float flt1 = 2f;
double dbl1 = 3;
double dbl2 = 7;
int flt2 = int1 / flt1; // ❌
double dbl3 = int1 / dbl1;
double dbl4 = dbl2 / int1;
float fltNum = 4.567f;
double dblNum = 5.678;
int int2 = (int) fltNum; // 4
int int3 = (int) dblNum; // 5
int int1 = 5;
float flt1 = 5f;
double dbl1 = 5.0;
double dbl2 = 7.89;
boolean bool0 = 123 == 123F; // true
boolean bool1 = int1 == flt1; // true
boolean bool2 = flt1 == dbl1; // true
boolean bool3 = int1 == dbl2; // true
boolean bool4 = int1 > dbl2; // false
boolean bool5 = flt1 >= dbl2; // false
boolean bool6 = dbl1 < dbl2; // true
short
와 동일''
)를 사용하여 1개의 문자 표현 - 빈 문자 불가// 각 문자는 상응하는 정수를 가짐
char ch1 = 'A'; // -> 65
char ch2 = 'B'; // -> 66
char ch3 = 'a'; // -> 97
char ch4 = 'a' + 1; // 'b' -> 98
char ch5 = '가'; // -> 44032
char ch6 = '가' + 1; // '각' -> 44033
char ch7 = '가' + 2; // '갂' -> 44034
char ch8 = '가' + 3; // '갃' -> 44035
char ch9 = '나'; // -> 45208
// 형변환 가능
int ch1Int = (int) ch1; // 65
int ch9Int = ch9; // 45208
// 정수값과 연산하여 형변환 가능
int int_a1 = ch1 + 0; // 65
int int_a2 = ch1 - 0; // 65
// 문자 리터럴과 숫자, 유니코드로 표현 가능
char ch10 = 'A';
char ch11 = 65;
char ch12 = '\u0041'; // 'A'
int
1과 char
'1'은 다름// - 해당 문자의 정수값 확인
char ch_b1 = '1'; // -> 49
char ch_b2 = '2'; // -> 50
// ⚠️ 숫자 문자에 사칙연산 - 문자 번호 기준 결과 반환
char ch_b3 = '1' + '2'; // 'c' -> 99
int int_b4 = ch_b1 + ch_b2; // '1' -> 49
// 💡 아래의 기능으로 문자가 의미하는 정수로 변환
int int_d1 = '1' - '0' // 1
int int_d2 = Character.getNumericValue('2'); // 2
char empty = ''; // ❌
char space = ' '; // -> 32
// 같은 문자열인지 여부 반환
boolean bool1 = 'A' == 'A'; // true
boolean bool2 = 'A' == '가'; // false
// 숫자와 비교할 시 해당 정수값 기준으로
boolean bool3 = 'A' == 65; // true
boolean bool4 = 'A' > 64.0; // true
boolean bool5 = 'A' > 66f; // false
// 사전순 상 먼저 오는 쪽이 작음
boolean bool6 = 'A' < 'B'; // true
boolean bool7 = '가' > '나'; // false
출처 - 인프런 '제대로 파는 자바' 강의