Android SQLite:基于ArrayList循环计算POH_DISC2总折扣问询
问题分析与修正方案
原代码存在的问题
DISC2被错误设置为累加变量,导致每次计算当前行的DISC2折扣时,用的是所有已循环行的累计金额,而非当前行经过DISC1折扣后的金额。- 循环内频繁更新UI控件
pohdisc2,会造成不必要的性能损耗,应该在计算完成后统一赋值。 - 没有对
Price、Qty、Poddisc1等字段做非空和格式校验,一旦数据异常会直接抛出转换异常。
修正后的代码
private double calculatePOHDISC2() { double totalPOHDISC2 = 0.0; ArrayList<POModels> data = dbController.getAllDBPO(); for(POModels item : data) { // 跳过DISC2为空的行 if (item.getPoddisc2() == null || item.getPoddisc2().trim().isEmpty()) { continue; } try { // 解析当前行的数值字段 double price = Double.parseDouble(item.getPrice()); double qty = Double.parseDouble(item.getQty()); double disc1 = Double.parseDouble(item.getPoddisc1()); double disc2 = Double.parseDouble(item.getPoddisc2()); // 计算当前行原价总金额 double originalTotal = price * qty; // 计算DISC1折扣后的金额 double afterDisc1Total = originalTotal - (originalTotal * disc1 / 100); // 计算当前行的POH_DISC2并累加到总和 totalPOHDISC2 += afterDisc1Total * disc2 / 100; } catch (NumberFormatException e) { // 捕获数值转换异常,避免崩溃,可根据需求添加日志 Log.e("POHDISC2计算", "数据格式错误: " + e.getMessage()); } } // 循环结束后统一更新UI pohdisc2.setText(String.valueOf(totalPOHDISC2)); return totalPOHDISC2; }
计算逻辑说明
- 遍历
tbl_detail的每一行数据,跳过DISC2为空的记录; - 对当前行的价格、数量、折扣值做安全解析,避免格式错误导致崩溃;
- 先计算原价总金额(单价 × 数量);
- 减去DISC1的折扣额,得到DISC1折扣后的实际金额;
- 用这个金额乘以DISC2的百分比,得到当前行的POH_DISC2数值;
- 将所有行的POH_DISC2数值累加,得到最终的总POH_DISC2;
- 循环结束后统一更新UI控件,提升性能。
内容的提问来源于stack exchange,提问作者RAP
相关产品推荐
相关产品推荐

