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

支出追踪App中4类账单的饼图占比计算方法问询

支出追踪App:类别支出百分比计算修正方案

问题分析

你已经完成了各类别账单金额的汇总,但当前代码中的百分比计算逻辑存在多处错误:

  • 错误将total赋值为账单数量而非总支出金额
  • 百分比计算公式完全颠倒,且使用未初始化的变量,会引发运行时错误
  • 未处理总支出为0的边界情况

核心计算逻辑

某类支出占总支出的百分比公式为:

百分比 = (该类别总金额 ÷ 总支出金额) × 100

注意必须用浮点数运算避免整数除法导致的精度丢失(比如5/2在整数除法中结果为2,而非2.5)。

修正后的完整代码

package com.functionality.mylifehelper.drawerUI.ui.expenditure;

import java.util.ArrayList;
import java.util.List;

public class ExpensesManager {
    List<Bill> bills;
    Earning obj;

    // 各类别总金额
    int pricesForGroceries;
    int pricesForLoansEtc;
    int pricesForTripsEtc;
    int pricesForShopping;

    // 各类别百分比(需保留小数可改为double类型)
    int percentageGroceries;
    int percentageLoans;
    int percentageTrips;
    int percentageShopping;

    // 各类别账单列表(优化命名提升可读性)
    List<Bill> groceriesBills;
    List<Bill> loansBills;
    List<Bill> tripsBills;
    List<Bill> shoppingBills;

    public ExpensesManager(List<Bill> expenses, Earning earning) {
        bills = expenses;
        obj = earning;
        calculateCostAndPercentages();
    }

    private void calculateCostAndPercentages() {
        groceriesBills = new ArrayList<>();
        loansBills = new ArrayList<>();
        tripsBills = new ArrayList<>();
        shoppingBills = new ArrayList<>();

        // 重置金额统计,避免重复实例化时的累加错误
        pricesForGroceries = 0;
        pricesForLoansEtc = 0;
        pricesForTripsEtc = 0;
        pricesForShopping = 0;

        // 遍历账单,分类统计金额
        for(Bill bill : bills) {
            if(bill.getType().equals(Bill.food)) {
                groceriesBills.add(bill);
                pricesForGroceries += bill.getAmount();
            } else if(bill.getType().equals(Bill.loans)) {
                loansBills.add(bill);
                pricesForLoansEtc += bill.getAmount();
            } else if(bill.getType().equals(Bill.shopping)) {
                shoppingBills.add(bill);
                pricesForShopping += bill.getAmount();
            } else {
                tripsBills.add(bill);
                pricesForTripsEtc += bill.getAmount();
            }
        }

        // 计算总支出
        int totalExpense = getAllItemsCost();

        // 计算各类别百分比,处理总支出为0的边界情况
        if (totalExpense > 0) {
            percentageGroceries = (int) ((pricesForGroceries / (double) totalExpense) * 100);
            percentageLoans = (int) ((pricesForLoansEtc / (double) totalExpense) * 100);
            percentageTrips = (int) ((pricesForTripsEtc / (double) totalExpense) * 100);
            percentageShopping = (int) ((pricesForShopping / (double) totalExpense) * 100);
        } else {
            percentageGroceries = percentageLoans = percentageTrips = percentageShopping = 0;
        }
    }

    // 获取总支出金额
    public int getAllItemsCost() {
        return pricesForGroceries + pricesForTripsEtc + pricesForShopping + pricesForLoansEtc;
    }

    // 新增getter方法,供饼图模块调用各类别百分比
    public int getPercentageGroceries() {
        return percentageGroceries;
    }

    public int getPercentageLoans() {
        return percentageLoans;
    }

    public int getPercentageTrips() {
        return percentageTrips;
    }

    public int getPercentageShopping() {
        return percentageShopping;
    }
}

关键修正点说明

  1. 变量命名优化:将TYPE_1等无意义命名改为groceriesBills,提升代码可读性
  2. 金额重置:统计前重置各类别金额,避免多次调用或实例化时的累加错误
  3. 总支出计算:使用getAllItemsCost()的返回值作为总支出,而非账单数量
  4. 百分比计算修正:通过(double)强制转换为浮点数运算,避免整数除法精度丢失,最后转为int类型(需保留小数可将百分比变量改为double)
  5. 边界处理:增加总支出为0的判断,避免除以0的运行时异常
  6. 访问方法补充:添加各类别百分比的getter方法,方便饼图模块调用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 19:10:48