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
相关产品推荐
相关产品推荐

