为什么我的 C++ 程序输出 (0.2 / 0.1) = 1 而不是 2?

问题描述

该程序旨在转换用户输入的 USD($) 数量(从 0 美元到最多 10 美元),并以 25 美分、1 美分、镍币和便士的数量输出。

我目前正在使用:

  • 带有 Geany 1.37.1 的 Linux ParrotOS
  • G++ 编译命令:g++ -std=c++20 -Wall -c "%f"

#include <iostream>

const double QUARTER {0.25};
const double DIME {0.10};
const double NICKLE {0.05};
const double PENNY {0.01};

void dollarToCoin(double cash,unsigned short& quarters,unsigned short& dimes,unsigned short& nickles,unsigned short& pennies){
    
    double cashRemainder = cash;
    quarters = cashRemainder / QUARTER;
    cashRemainder -= QUARTER * quarters;
    dimes = cashRemainder / DIME;
    cashRemainder -= DIME * dimes;
    nickles = cashRemainder / NICKLE;
    cashRemainder -= NICKLE * nickles;
    pennies = cashRemainder / PENNY;
    cashRemainder -= PENNY * pennies;
    std::cout << "Remaining cash: " << cashRemainder << '\n';

}

int main(){
    
    double cash{0};
    unsigned short quarters{0};
    unsigned short dimes{0};
    unsigned short nickles{0};
    unsigned short pennies{0};
    
    std::cout << "Input your cash ($0 - $10 max): ";
    std::cin >> cash;
    dollarToCoin(cash,quarters,dimes,nickles,pennies);
    
    std::cout << "Total quarters: " << quarters <<
    '\n' << "Total dimes: " << dimes <<
    '\n' << "Total nickles: " << nickles << 
    '\n' << "Total pennies: " << pennies << '\n';
    

    return 0;
}

有问题的行是 nickles = cashRemainder / NICKLE; 函数中的 dollarToCoin()。这是伪代码:

  1. 启动程序,我以1.2为例
  2. dollarToCoin() 中,我们将现金(1.2 美元)复制到 cashRemainder
  3. 我们通过除以 quarters = 4.8 来计算 cashRemainder (1.2) / QUARTER (0.25),我们只保存整数并丢失 .8(现在我们有 4 个季度 = 1.00 美元)
  4. 我们将这 4 个季度减去 cashRemainder (1.2) 给出的 0.2
  5. 这是我的困惑部分:如果我调试这部分,我们计算总次数 dimes = cashRemainder(0.2) / DIME (0.1),它输出 1 而不是 2。

然而,如果我使用 --> dimes = cashRemaindder / DIME 替换 dimes = 0.2 / DIME 这实际上输出 2。

在程序结束时,它应该将输入(1.2)转换为:

Quarters: 4,Dimes: 2,Nickles: 0,Pennies: 0

我仍然没有优化代码,也没有使用任何库(我知道有更简单的方法)我只是对为什么会发生这种情况感到困惑。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)