我正在尝试用 C++ 创建一个收银机应用程序,它向客户询问商品的价格和支付金额,然后在其中显示以美元、25 美分、10 美分和便士为单位的变化:
#include <iostream>
using namespace std;
void printChange(int&, int&, int&, int&, int&);
void findCoins(int&, int&, int&, int&, int&);
int main()
{
double price;
double payment;
char answer = 'y';
int dollars, quarters, dimes, nickels, pennies;
while(answer == 'y')
{
cout<<"Enter price of an item: "<<endl;
cin>>price;
cout<<"Enter payment from customer: "<<endl;
cin>>payment;
double change = payment - price;
dollars = change; //use implicit conversion
change = change * 100; //multiplication
int coins = change - dollars * 100;
findCoins(coins, quarters, dimes, nickels, pennies);
printChange(dollars, quarters, dimes, nickels, pennies);
cout<<"Do you have another transaction?";
cin>>answer;
}
cout<<"Thanks for shopping at Albertsons!"<<endl;
return 0;
}
void printChange(int& dol, int& q, int& d, int& n, int& p)
{
cout<<"dollars "<<dol<<endl;
cout<<"quarters: "<<q<<endl;
cout<<"dimes: "<<d<<endl;
cout<<"nickels: "<<n<<endl;
cout<<"pennies: "<<p<<endl;
}
void findCoins(int& coins, int& quarters, int& dimes,
int& nickels, int& pennies)
{
quarters = coins/25; //use implicit conversion
dimes = coins % 25 / 10; //use remainder division
nickels = coins % 25 % 10 / 5;
pennies = coins % 25 % 10 % 5;
}
这里的问题是我需要将零钱( double )转换为硬币(整数),以便我可以使用模数来确定收银员欠客户多少 25 美分、10 美分、5 美分和便士并且无论我从哪个角度处理问题,我都会不断收到相同的错误 - 原始 double 值减去 1(在某些情况下)。
例如
Enter price of an item:
10
Enter payment from customer:
10.69
dollars 0
quarters: 2
dimes: 1
nickels: 1
pennies: 3
相比于:
Enter price of an item:
1.26
Enter payment from customer:
5.00
dollars 3
quarters: 2
dimes: 2
nickels: 0
pennies: 4
注意:我知道我可以使用 fmod() 而不是 double 值的模数,但即使将硬币更改为 double 值,我仍然遇到相同类型的截断错误,特别是在以下情况下:
Enter price of an item:
45
Enter payment from customer:
47.47
dollars 2
quarters: 1
dimes: 2
nickels: 0
pennies: 1
请注意我是如何减价的(与第一个示例相同的问题)?我对 C++ 比较陌生,但我在 Java 方面有一年多的经验,而且在从 double 转换为 int 时我从来没有遇到过这种奇怪的截断错误(我知道在某些情况下小数点会丢失,但为什么在多个实例中将整个 double 值减去 1?)
具体来说,您会建议对我的代码进行哪些更改,以防止出现这种恼人的截断错误?
最佳答案
What changes to my code, specifically, would you recommend as to prevent this annoying truncation error?
Never, ever, ever, ever, ever*100, ever1700, 出于任何原因,用任何编程语言用浮点值记录货币值。
如果您使用的是美元,请将它们记录为整数(最好是 64 位整数)美分(或十分之一美分;当您的代码用于加油站价格时您会感谢我)并将它们相乘当您需要以文本方式显示金额时。编写一个自定义的 Currency
类,它将自动执行这些转换,并将金额的内部记录保存为整数定点数,但将转换为 float 仅供显示 在需要的时候。
关于C++ Double 到 Int 转换复杂化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37977478/