C#新手求助:数组存储收据数据,无法统计并显示小计
问题解决:C#收据程序小计金额计算错误
核心问题分析
- 你定义了
quantity和price数组但未实际使用,反而将价格、数量以字符串形式存在items数组中,且从未将单行小计累加到subtotal变量,导致最终显示的小计始终为0。 - 使用
Convert.ToDouble处理货币值存在精度风险,C#中处理金额应该用decimal类型。
修改后的代码
// 用字符串数组存储条目信息,维护decimal类型的小计变量保证精度 string[,] items = new string[100, 4]; decimal subtotal = 0; int count = 0; for (int i = 0; i < 100; i++) { Console.Write("Enter Item Name(enter 0 to stop): "); items[i, 0] = Console.ReadLine(); if (items[i, 0] == "0") break; // 读取价格并转换为decimal,增加输入验证 Console.Write("Enter Item Price: "); if (!decimal.TryParse(Console.ReadLine(), out decimal itemPrice)) { Console.WriteLine("请输入有效的数字价格!"); i--; // 重新输入当前条目 continue; } items[i, 1] = itemPrice.ToString("C"); // 可选:直接格式化为货币格式 // 读取数量并转换为int,增加输入验证 Console.Write("Enter Item Quantity: "); if (!int.TryParse(Console.ReadLine(), out int itemQuantity)) { Console.WriteLine("请输入有效的整数数量!"); i--; // 重新输入当前条目 continue; } items[i, 2] = itemQuantity.ToString(); // 计算单行小计并累加到总小计 decimal lineSubtotal = itemPrice * itemQuantity; items[i, 3] = lineSubtotal.ToString("C"); subtotal += lineSubtotal; count++; } Console.WriteLine(" Your Receipt"); for (int i = 0; i < count; i++) { // 优化显示格式,避免每个元素单独换行(可选,按需调整) Console.WriteLine($"{items[i, 0],-15} {items[i, 2],5} x {items[i, 1],10} = {items[i, 3],10}"); } Console.WriteLine("-------------------"); Console.WriteLine($"\n{count} Items total: "); Console.WriteLine($"Subtotal: {subtotal:C}"); decimal tax = subtotal * 0.065M; Console.WriteLine($"Tax (6.5%) {tax:C}"); decimal total = tax + subtotal; Console.WriteLine($"Total: {total:C}");
关键修改点说明
- 累加小计:计算每个条目的单行小计后,立即通过
subtotal += lineSubtotal将其加入总小计,解决了小计为0的问题。 - 类型安全:用
decimal.TryParse替代Convert.ToDouble,既保证了货币计算的精度,又增加了输入验证,避免非法输入导致程序崩溃。 - 冗余清理:移除了未使用的
quantity和price多维数组,简化了代码结构。 - 格式优化:用字符串插值和对齐语法调整了收据排版(你提到格式问题稍后处理,这里提供一个可选方案)。
内容的提问来源于stack exchange,提问作者Rex
相关产品推荐
相关产品推荐

