본문 바로가기

Java Programming

DecimalFormat? 재래식 소숫점 날려버리기!!

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
Quiz 2를 풀고 나서 Test를 해보면 아래와 같은 화면이 출력되었습니다.
Quiz 2는 아래 링크된 사이트로 가시면 보실수 있습니다.

리얼스터디 팀 블로그 : Quiz 3

일단은 Test 코드를 보시도록 하시죠

Please Insert the Number of Students
4
Please Insert Payments for each of Students : 4 student(s) you Inserted.
15.00
15.01
3.00
3.01
$12

실제로 계산을 하면 알겠지만 12$라는 값은 틀린 값입니다. 비슷한 수치가 나오지만 프로그램이라는것은 특히나 컴퓨터라는것은 사람들로 하여금 쉽게 믿게끔 하기때문에 올바르지 않은 수치가 나오면 안되겠지요.. 어쨌든 풀었습니다만 답이 바르지 않기 때문에 푼것이 아니었으며, 주말 내내 고민했던 문제였는데 이렇게 되어버리는 허망했습니다. 더군다나 3번 문제로 골머리를 앓고 있었기 때문에 -ㅅ-;; 여튼... 방치를 해놓고 있었습니다.

어디서 문제가 발생하는 것인가!! 생각하던 도중에 노트를 펼치고 계산을 해보았습니다. 전혀 이상이 없다는 것을 알았고 중간중간 콘솔창에 출력을 시켜 본 결과... - -;; 아래의 메소드에서 문제점이 있다는 것을 알았습니다.


overAverageStudents는 말그대로 평균 점수 이상의 학생들의 지출 비용을 모아놓은 배열인데 여기에서 평균값을 뺀후에 그것을 모두 더하면 원하는 값이 나오지만, 중간에 콘솔창으로 값을 출력하게 해보니..

for 루프가 한번돌아갔을때 decision의 값이 5.995000000000001 두번 돌아갔을때는 6.005000000000001가 더해집니다. 그러니까 답이 12.000000000000002 가 나오덥니다 - -;; 말도 안되죠;; 일단 저런 화폐 단위가 없을뿐 더러 올바른 계산도 아닙니다.

고민하다가 고민하다가.. (짧은 시간 같지만 장장 3시간이 넘었습니다 ㅠㅠ) 결국은 아래와 같이 고쳤습니다.


소숫점 3자리 이하를 잘라내기 위해서 100이라는 숫자를 곱한다음에 long 형으로 캐스트 해주면, 그 이하의 소숫점 그러니까 저 뒤에 있는 1을 포함해서 나머지 소숫점들이 날라가겠죠.. -ㅅ- ㅋㅋ 그리고.. 거기에 다시 100으로 나눠준후에 double형으로 다시 캐스트 해주는 겁니다. 그러면 깔끔 +_+ 처음에는 DecimalFormat를 사용했었지만 그냥 잘 모르고 사용을 했기때문에 낭패를 봤지만 이런식으로 하면 되겠다.. 하는 생각이 들어서 ^^ ㅋㅋㅋ 사실 API를 사용하는쪽이 더 명시적이라고 생각하지만.. 이것도 기특한 방법이라고 사료됩니다!!