You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
}

计算逻辑说明

  1. 遍历tbl_detail的每一行数据,跳过DISC2为空的记录;
  2. 对当前行的价格、数量、折扣值做安全解析,避免格式错误导致崩溃;
  3. 先计算原价总金额(单价 × 数量);
  4. 减去DISC1的折扣额,得到DISC1折扣后的实际金额;
  5. 用这个金额乘以DISC2的百分比,得到当前行的POH_DISC2数值;
  6. 将所有行的POH_DISC2数值累加,得到最终的总POH_DISC2;
  7. 循环结束后统一更新UI控件,提升性能。

内容的提问来源于stack exchange,提问作者RAP

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 16:30:44