연습문제와 해답 출처 : 자바의 정석 저자 GitHub
자료형 / 크기 | 1 byte | 2 byte | 4 byte | 8 byte |
---|---|---|---|---|
논리형 | boolean | |||
문자형 | char | |||
정수형 | byte | short | int | long |
실수형 | float | double | ||
참조자료형 | Object |
모든 참조 자료형의 크기는 4 Byte
정수 자료형의 표현 범위
byte는 1byte 크기를 갖기때문에
byte에 담을 수 있는 정수 값의 범위는 2⁸ = -128 ~ 127
char와 short는 둘다 2byte로 같은 크기를 갖지만,
char는 문자 표현 자료형이고, short는 정수 표현 자료형으로, 값의 표현 범위가 다르다.
문자 표현을 하는 char은 0~2¹⁶-1 까지를 표현 할 수 있지만,
shot는 음수와 양수를 모두 표현하기 때문에, -2⁸ ~ 2⁸-1 범위의 숫자만 표현을 할 수 있다.
다음에 주어진 화씨를 섭씨로 변환하는 코드를 마저 작성하여
소수점 셋째자리에서 반올림되는 결과값을 출력하시오.
* 화씨를 섭씨로 변환하는 공식 = C = 5/9 * (F - 32)
class Exercise3_7 {
public static void main(String[] args) {
int fahrenheit = 100;
float celcius =
System.out.println("화씨 : " + fahrenheit);
System.out.println("섭씨 : " + celcius);
}
}
해설
화씨를 섭씨로 변환하는 공식은 "5/9f * (fahrenheit - 32)" 이다.
여기에서 소수점 셋째자리에서 반올림을 하려면 다음의 과정을 거쳐야 한다.
1. 값에 100을 곱한다.
37.77778 * 100 = 3777.778
2. 1의 결과에 0.5를 더한다.
3777.778 + 0.5 = 3778.278
3. 2의 결과를 int 타입으로 변환한다.
(int)3778.278 = 3778
4. 3의 결과를 100f로 나눈다.
3778/100f = 37.78
따라서 celcius에 들어갈 문장은 " (int)((5/9f * (fahrenheit - 32) * 100) + 0.5)/100f "
문제
float f2 = 0.1f;
double d = 0.1;
boolean result = d==f2;
해설
비교연산자도 이항연산자이므로 연산 시 두 피연산자의 타입을 맞추기 위해 형변환이 발생한다.
그래서 double과 float의 연산은 double과 double의 연산으로 자동 형변환 되는데,
실수는 정수와 달리 근사값으로 표현을 하기 때문에 float을 double로 형변환했을 때 오차가 발생할 수 있다.
그래서 float 값을 double로 형변환하기 보다는,
double값을 유효자리수가 적은 float으로 형변환해서 비교하는 것이 정확한 결과를 얻는다.