请求排查C++代码计算逻辑错误:牛奶产量相关结果不符
解决C++牛奶产量计算中纸箱数与利润的精度偏差问题
嘿,我瞅见你这个编程练习里碰到了俩小问题——纸箱数量少算了1个,利润也和预期有细微出入,咱们来一步步捋清楚咋解决!
问题根源分析
咱们先拆解下你遇到的两个问题:
- 纸箱数量少1个:你现在用
static_cast<int>(numCartons)直接把浮点结果的小数部分截断了,但实际生产逻辑里,哪怕剩下一点点牛奶,也得额外用一个纸箱来装。比如输入3590.56时,3590.56 / 3.78 ≈ 949.883,截断后得到949,但实际需要950个纸箱,这时候得用向上取整而不是直接截断。 - 利润偏差:你的利润是用浮点型的
numCartons(≈949.883)乘以0.27计算的,结果≈256.47,但预期利润是基于实际需要的950个纸箱计算的(950*0.27=256.5),所以本质上是纸箱数的计算方式不对导致了利润的偏差。
修改后的代码
要解决这俩问题,咱们需要做两处调整:
- 引入
<cmath>头文件,使用ceil()函数来实现向上取整 - 先计算向上取整后的纸箱数,再用这个整数来计算利润
#include<iostream> #include<string> #include<iomanip> #include<fstream> #include<cmath> // 新增:用于ceil()函数 using namespace std; const double CARTON = 3.78; const double PRODUCECOST = 0.38; const double PROFIT = 0.27; int main() { double milkProduced; int numCartons; // 改为int类型,因为纸箱数是整数 double costOfProducing, profitOfProducing; cout << fixed << showpoint << setprecision(2); cout << "What was the total amount of milk produced in the morning: " << endl; cin >> milkProduced; // 重点:用ceil()向上取整,再转成int numCartons = static_cast<int>(ceil(milkProduced / CARTON)); costOfProducing = milkProduced * PRODUCECOST; profitOfProducing = numCartons * PROFIT; // 用整数纸箱数计算利润 cout << numCartons << endl; cout << costOfProducing << endl; cout << profitOfProducing << endl; return 0; }
验证结果
用你的示例输入3590.56测试:
- 纸箱数:
ceil(3590.56/3.78) = ceil(949.883) = 950,符合预期 - 利润:
950 * 0.27 = 256.5,完全匹配预期 - 生产成本:
3590.56 * 0.38 = 1364.4128,保留两位小数后是1364.41,和你之前的正确结果一致
额外提示
ceil()函数会返回大于等于输入值的最小整数,正好贴合“哪怕剩一点牛奶也要多一个纸箱”的业务逻辑- 记得一定要包含
<cmath>头文件,不然编译器会找不到ceil()函数哦
内容的提问来源于stack exchange,提问作者Darunia
相关产品推荐
相关产品推荐

