Python打印账单重复输出最后一条输入数据的问题解决方法
问题成因
打印商品明细的循环存在索引引用错误:
录入商品的外层循环使用变量item作为计数器,当该循环执行完毕后,item会固定为range(N)的最后一个值(即N-1)。后续打印明细的循环虽然使用i作为遍历变量逐次递增,但读取字典数据时始终写的是compra[item+1],等价于每次循环都固定读取最后一个录入的商品条目,因此会重复N次输出最后一条商品数据。
另外原代码还存在一个隐性精度问题:计算单商品总价时使用int()对IVA计算结果做强制类型转换,会直接截断小数部分,导致金额统计出现误差。
修复方案
- 将打印循环中所有读取字典的
compra[item+1]替换为compra[i+1],保证每次循环读取当前遍历序号对应的商品数据 - 将单商品总价计算处的
int()强转替换为float(),保留小数精度,避免金额计算错误 - 补全Python要求的层级缩进(循环、判断分支下的代码必须统一缩进4个空格,否则会直接触发语法错误)
- 可选优化:最终金额输出时使用
round(数值, 2)保留两位小数,符合日常金额显示习惯
修复后完整代码
N = int(input("Digite la cantidad de Artículos a facturar: ")) dataProd = ('Código', 'Nombre', 'Cantidad', 'Valor unitario', 'Tipo de IVA') compra = {} acuSubTotal = 0 acuIvatotal = 0 acuTotalprod = 0 for item in range(N): listdataProd = [] for dato in dataProd: listdataProd.append(input(f"Digite el {dato} del producto {item + 1}: ")) compra[item+1] = listdataProd # 计算单商品小计 compra[item+1].append(int(compra[item+1][2]) * int(compra[item+1][3])) iva = (0, 0.05, 0.19) # 计算单商品IVA if int(compra[item+1][4]) == 1: compra[item+1].append(float(compra[item+1][5]) * iva[0]) elif int(compra[item+1][4]) == 2: compra[item+1].append(float(compra[item+1][5]) * iva[1]) else: compra[item+1].append(float(compra[item+1][5]) * iva[2]) # 计算单商品总价,替换原int强转为float避免精度丢失 compra[item+1].append(float(compra[item+1][5]) + float(compra[item+1][6])) acuSubTotal += compra[item+1][5] acuIvatotal += compra[item+1][6] acuTotalprod += compra[item+1][7] print("\n****************") print("Detalles de la compra: ") print("****************") # 修正索引引用,遍历读取对应序号的商品数据 for i in range(N): print(f"\nCodigo del Producto {i + 1}: ", compra[i+1][0]) print(f"Nombre del Producto {i + 1}: ", compra[i+1][1]) print(f"Cantidad del Producto {i + 1}: ", compra[i+1][2]) print(f"Valor Unitario del Producto {i + 1}: ", compra[i+1][3]) print(f"Tipo de Iva del Producto {i + 1}: ", compra[i+1][4]) print(f"Subtotal del Producto {i + 1}: ", compra[i+1][5]) print(f"Iva del Producto {i + 1}: ", compra[i+1][6]) print(f"Valor Total del Producto {i + 1}: ", compra[i+1][7]) print("\n****************") print("Totales de la compra: ") print("****************") print("SubTotal de la compra: ", acuSubTotal) print("IVA Total de la compra: ", round(acuIvatotal, 2)) print("Total de la compra: ", round(acuTotalprod, 2))
内容的提问来源于stack exchange,提问作者Jaider Durán
相关产品推荐
相关产品推荐

