jw950310   5년 전

이 코드로 일단 성공은 떴습니다. 하지만 이해가 되지 않는 부분이 있습니다. Line 26의 

int hundegree = (int)(((1000 * degree)+5)/10);

이부분입니다. 문제의 input은 소수 둘째자리까지만 주어집니다.

그래서 처음에 저는

int hundegree = (int)(100*degree);를 했는데, 계속 실패가 떴습니다. 이를

int hundegree = (int)(((1000 * degree)+5)/10);로 바꾸니 잘 됩니다.

아래 식이 소수 셋째자리숫자가 0~4면 내림, 5~9면 올림해주는 식인 것은 알겠습니다.

그런데 어차피 input은 소수 둘째자리까지만 주어지기 때문에 셋째자리는 0인것과 다름없고, 따라서 무조건 내림해야하는것 아닌가요?

그래서 그냥 (int)(100*degree)했는데 왜 이 경우는 안 되는지 이해가 되지 않습니다.

읽어주셔서 감사합니다.

luniro   5년 전

부동소수점 오차때문인 것 같습니다 5.00 으로 입력을 받아도 값이 4.9999999999999999 로 들어가 있는 경우 hundegree에는 499가 들어가게 됩니다

int hundegree = (int)(100*degree + 0.00001);과 같이 하셔도 해결될 것 같습니다

Green55   5년 전

실수 자료형은 항상 부정확합니다. 예를 들어 (int)(296.46 * 100) 의 값을 출력해보면, 29645가 나옵니다.

실제로 컴퓨터가 실수형 자료형을 저장할 때 정확히 296.46을 저장하지 못하고 이에 근사치인 296.45999... 같은 식으로 저장하여, 오차가 발생한다고 이해하시면 될 것 같습니다.

따라서 실수가 주어질 때는 항상 실수형 자료형에 담기 전에 고민해야합니다. 예를 들어 이 문제는 문자열에 입력을 받아서 처리하면 오차 없이 문제를 해결할 수 있습니다.

댓글을 작성하려면 로그인해야 합니다.