C++ Double 到 Int 转换复杂化

标签 c++

我正在尝试用 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/

相关文章:

c++ - 将 long long 类型的数字传递给函数(引用与值)(C++)

c++ - 我想返回局部变量的地址

c++ - 一个简单的c++程序的编译过程

c++ - 为什么我在使用enable_shared_from_this()时会遇到异常?

c++ - C++ 中的基本 OSC 教程?使用什么库?

C++ 运算符重载 Int 类型

c++ - 如何在一台本地机器/主机上对简单的 tcp 客户端/服务器进行单元测试?

c++ - 如何根据用户输入创建函数?

c++ - 如何动态交换 QWidgets

c++ - Visual Studio 2012的任何免费C/C++重构工具/插件?