2014-09-27 2 views
0

나는이 변경 계산기를 썼고 changeAmount 값으로 $ 2.30을 입력 할 때를 제외하고는 모두 잘 작동한다. 어떻게 해결할 수 있습니까? 이 코드는 :

#include <iostream> 

using namespace std; 

int main() 
{ 
double changeAmount; 
int fives; 
int ones; 
int quarters; 
int dimes; 
int nickels; 
int pennies; 
cout <<"*** A Very Simple Change Machine ***" <<endl; 
cout <<endl; 
cout <<"Enter change amount --> "; 
cin >>changeAmount; 
cout <<"The change amount is $" <<changeAmount <<" ." <<endl; 
cout <<endl; 

if (changeAmount < 0) 
{ 
    cout << "Invalid amount." <<endl; 
} 
else 
{ 

    changeAmount = changeAmount * 100; 
    changeAmount = int(changeAmount); 

    fives = changeAmount/500 ; 
    changeAmount -= fives * 500; 

    ones = changeAmount/100 ; 
    changeAmount -= ones * 100; 

    quarters = changeAmount/25; 
    changeAmount -= quarters * 25; 

    dimes = changeAmount/10; 
    changeAmount -= dimes * 10; 

    nickels = changeAmount/5; 
    changeAmount -= nickels * 5; 

    pennies = changeAmount/1 ; 
    changeAmount -= pennies * 1; 

    cout <<"Your change is given as :" <<endl; 
    cout <<" $5 bill (s) : " <<fives <<endl; 
    cout <<" $1 bill (s) : " <<ones <<endl; 
    cout <<" quarter (s) : " <<quarters <<endl; 
    cout <<" dime (s)  : " <<dimes <<endl; 
    cout <<" nickel (s) : " <<nickels <<endl; 
    cout <<" penny (ies) : " <<pennies <<endl; 
} 
return 0; 
} 
+0

먼저, 디버거로 코드를 단계별로 실행하여 문제가 어디에 있는지 찾아야합니다. –

+0

디버거를 사용하여 시작하십시오. 참고로'pennies = changeAmount/1;'은'pennies = changeAmount; '와 같고,'changeAmount - = pennies * 1;'을 완전히 제거 할 수 있습니다. 왜냐하면 의미가 없기 때문입니다. (이후에는'changeAmount'를 더 이상 언급하지 않으므로 값을 업데이트 할 필요가 없으며 불필요한 곱셈과 뺄셈을 피하기 위해'changeAmount = 0; '을 사용할 수 있습니다.) –

+3

재무 계산을위한 부동 소수점. 아프다, 아프다! – Deduplicator

답변

-1

문제는 소수가 시스템에 저장하는 방법으로한다. 2.30은 2.29 ...로 저장되고, 100을 곱하여 정수 부분을 취하면 229가됩니다. 100을 곱하면 라운드 함수를 사용하여 반올림합니다. 수학 라이브러리를 포함해야합니다.

else 
{ 

    changeAmount = round(changeAmount * 100); 
    changeAmount = int(changeAmount); 

} 
+0

사실 나는 디버깅을 시작할 때 그 사실을 알아 차렸다. 난 둥근 함수를 사용하는 방법을 모르지만 나는 100을 곱한 후에 'changeAmount'에 0.0000000001을 추가하려고 생각했습니다. –

+0

그냥 #include 을 헤더에 넣은 다음 위에 게시 한 코드를 사용하십시오. –

+0

라운드가 작동하지 않아서'ceil' 함수를 사용해야했습니다. 하지만 효과가있었습니다. 감사합니다 :) –

1

문제는 당신이 더블을 사용하여 모듈 arithmetics을하고 있다는 것입니다. 이것은 안정적으로 작동하지 않습니다. 예제를 적용하려면 changeAmount 유형을 int으로 변경할 수 있습니다.

+0

실제로 유형을 double에서 float으로 변경하여 효과적입니다. –

+0

@AdamRich : 그저 해결 방법입니다. – Caramiriel

+0

하지만 내부 표현 때문에 운이 좋았을뿐입니다. –

0

컴파일이 (. 당신은 입력에서 두 번 읽기를 저장하는 두 번째 varialbe을 소개 할 수 있습니다) 어떻게되는지 :

changeAmount = changeAmount * 100; 
cout <<"The change amount is $" <<changeAmount <<" ." <<endl; //230 
changeAmount = int(changeAmount); 
cout <<"The change amount is $" <<changeAmount <<" ." <<endl; //229 
관련 문제