자바(java)의 정석을 보던 도중..
3-7 번 문제에서 막혔다. 문제내용은 다음과 같다.
화씨를 섭씨로 변환하는 코드를 작성해야하는데, 변환공식은 C = 5/9 * (F -32) 이라고 한다.
int 로 섭씨가 주어지고, 이것을 float 변수에 계산 후 대입시켜야하는데,
변환 결과값을 셋째자리에서 Math.round() 메소드 없이 반올림 하라는 것이다.
int fahrenheit = 100;
float celcius = 5/9 * ( fahrenheit - 32 );
System.out.println( celcius );
>> 0.0
????
celcius 에 5/9의 값인, 0.55... 과 fahrenheit-32 의 값인 68을 곱한것은 대략 37.xx 가 나올텐데 왜?
float 은 실수를 저장해준다고 하지 않았었나?
궁금증을 가지고 뒤의 몇 문장을 지웠다.
float celcius = 5/9;
System.out.println( celcius );
>> 0.0
????!!
이게 문제였다. 5와 9는 int형 끼리의 나눗셈으로, 나머지를 버린 값을 반환한다.
자바는 나머지자리를 찾아서 고스란히 float 변수에 넣어주는것이 아닌,
int 끼리의 나머지는 일단 버린다. 그래서 형 변환을 명시적으로 해주어야한다.
int 끼리의 나눗셈이 아닌, float 변수가 포함되어있으니, 나머지를 버리지 말라고 말을 해줘야한다.
float celcius = 5/9f;
System.out.println( celcius );
>> 0.5555556
good boi <3
아래는 나의 해결방법이다.
float cal = (5/9f * (fahrneheit-32))*1000;
float celcius = (int)cal%10 >= 5 ?
(int)cal + (10 - (int)cal%10) :
(int)cal - (10 - (int)cal%10);
System.out.println(fahrneheit + ".F => "+ celcius/1000f + ".C");