You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ZyLab硬币总金额计算任务:C++代码错误排查求助

硬币金额计算C++代码错误排查

问题背景

给定代表1美元银币、半美元、25美分、10美分、5美分、1美分数量的六个非负整数,需计算总金额并以Amount: $X.XX格式输出(保留两位小数)。示例输入5 3 4 3 2 1对应输出Amount: $5.66,但以下代码无法得到正确结果:

#include <iostream>
#include <iomanip>

using namespace std;

int main() {
    double totalAmount;
    int dollars;
    int halfDollars;
    int quarters;
    int dimes;
    int nickels;
    int pennies;

    /* get input */
    cin >> dollars;
    cin >> halfDollars;
    cin >> quarters;
    cin >> dimes;
    cin >> nickels;
    cin >> pennies;

    /* calculate totalAmount */
    cout << fixed << setprecision(2);
    halfDollars = halfDollars * 0.5;
    quarters = quarters * 0.25;
    dimes = dimes * 0.10;
    nickels = nickels * 0.05;
    pennies = pennies * 0.01;
    totalAmount = dollars + halfDollars + quarters + dimes + nickels + pennies;
    /* output results */
    cout << "Amount: " << totalAmount << endl;
    return 0;
}

错误分析

  • 整数截断导致金额计算错误:halfDollars、quarters等变量均为int类型,执行halfDollars = halfDollars * 0.5时,浮点数计算结果会被强制转换为整数(直接截断小数部分)。例如3个半美元本应是1.5美元,赋值给int后变为1美元,直接丢失0.5美元,这是核心错误。
  • 输出格式不符合要求:示例输出需要包含美元符号$,但代码输出中缺少该符号。
  • 浮点数精度隐患:直接用浮点数计算硬币金额,可能因二进制浮点数的特性出现微小精度误差(如1美分的累加)。

修正后的代码

方案1:直接修正浮点数计算逻辑

保留浮点数计算,但不修改原整数变量,直接在求和时计算对应金额:

#include <iostream>
#include <iomanip>

using namespace std;

int main() {
    double totalAmount;
    int dollars;
    int halfDollars;
    int quarters;
    int dimes;
    int nickels;
    int pennies;

    cin >> dollars >> halfDollars >> quarters >> dimes >> nickels >> pennies;

    cout << fixed << setprecision(2);
    totalAmount = dollars + halfDollars * 0.5 + quarters * 0.25 + dimes * 0.1 + nickels * 0.05 + pennies * 0.01;
    cout << "Amount: $" << totalAmount << endl;

    return 0;
}

方案2:用整数计算总美分(推荐,避免浮点数误差)

先计算总美分数(整数),再转换为美元,彻底避免浮点数精度问题:

#include <iostream>
#include <iomanip>

using namespace std;

int main() {
    int dollars;
    int halfDollars;
    int quarters;
    int dimes;
    int nickels;
    int pennies;

    cin >> dollars >> halfDollars >> quarters >> dimes >> nickels >> pennies;

    // 计算总美分数
    int totalCents = dollars * 100 + halfDollars * 50 + quarters * 25 + dimes * 10 + nickels * 5 + pennies;
    // 转换为美元
    double totalAmount = totalCents / 100.0;

    cout << fixed << setprecision(2);
    cout << "Amount: $" << totalAmount << endl;

    return 0;
}

内容的提问来源于stack exchange,提问作者prud1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 02:10:18