餐厅账单平分计算程序输出不符预期问题排查
餐厅账单个人应付金额计算程序错误修复
当输入账单金额50美元、10%税率、20%小费比例时,程序实际输出32.50美元,但预期输出应为33.00美元。以下是问题分析与修复方案:
错误点分析
- 小费计算基数错误:小费应基于含税后的账单总金额计算,而非原始账单金额。当前代码中小费直接用原始账单金额计算,导致小费金额少算,最终总账单偏低。
- 整数除法导致精度丢失:
tip是整数类型,tip/100会执行整数除法(例如20/100结果为0而非0.2),无法得到正确的小费比例。
修正后的代码
// Calculate your half of a restaurant bill // Data types, operations, type casting, return value #include <cs50.h> #include <stdio.h> #include <math.h> float half(float bill, float tax, int tip); int main(void) { float bill_amount = get_float("Bill before tax and tip: "); float tax_percent = get_float("Sale Tax Percent: "); int tip_percent = get_int("Tip percent: "); printf("You will owe $%.2f each!\n", half(bill_amount, tax_percent, tip_percent)); } // 修正后的账单计算函数 float half(float bill, float tax, int tip) { // 计算含税账单金额 float tax_amount = bill * (tax / 100); float after_tax_bill = bill + tax_amount; // 基于含税金额计算小费,转换tip为浮点数避免整数除法 float tip_amount = after_tax_bill * ((float)tip / 100); // 计算总账单并平分 float total_bill = after_tax_bill + tip_amount; return total_bill / 2; }
修正逻辑说明
- 先计算含税后的账单金额:
after_tax_bill = bill + tax_amount; - 以含税金额为基数计算小费,通过
(float)tip将整数转换为浮点数,确保tip/100得到正确的浮点比例; - 总账单为含税金额加小费,最后平分得到个人应付金额。
测试输入50美元账单、10%税率、20%小费比例时:
- 含税金额:50 + 50×0.1 = 55美元;
- 小费:55×0.2 = 11美元;
- 总账单:55 + 11 = 66美元;
- 个人应付:66÷2 = 33.00美元,与预期结果一致。
内容的提问来源于stack exchange,提问作者user21087049
相关产品推荐
相关产品推荐

