16521번 - A Symmetrical Pizza
이 코드로 일단 성공은 떴습니다. 하지만 이해가 되지 않는 부분이 있습니다. 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)했는데 왜 이 경우는 안 되는지 이해가 되지 않습니다.
읽어주셔서 감사합니다.
부동소수점 오차때문인 것 같습니다 5.00 으로 입력을 받아도 값이 4.9999999999999999 로 들어가 있는 경우 hundegree에는 499가 들어가게 됩니다
int hundegree = (int)(100*degree + 0.00001);과 같이 하셔도 해결될 것 같습니다
실수 자료형은 항상 부정확합니다. 예를 들어 (int)(296.46 * 100) 의 값을 출력해보면, 29645가 나옵니다.
실제로 컴퓨터가 실수형 자료형을 저장할 때 정확히 296.46을 저장하지 못하고 이에 근사치인 296.45999... 같은 식으로 저장하여, 오차가 발생한다고 이해하시면 될 것 같습니다.
따라서 실수가 주어질 때는 항상 실수형 자료형에 담기 전에 고민해야합니다. 예를 들어 이 문제는 문자열에 입력을 받아서 처리하면 오차 없이 문제를 해결할 수 있습니다.
댓글을 작성하려면 로그인해야 합니다.
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)했는데 왜 이 경우는 안 되는지 이해가 되지 않습니다.
읽어주셔서 감사합니다.