支出追踪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; } }
关键修正点说明
- 变量命名优化:将
TYPE_1等无意义命名改为groceriesBills,提升代码可读性 - 金额重置:统计前重置各类别金额,避免多次调用或实例化时的累加错误
- 总支出计算:使用
getAllItemsCost()的返回值作为总支出,而非账单数量 - 百分比计算修正:通过
(double)强制转换为浮点数运算,避免整数除法精度丢失,最后转为int类型(需保留小数可将百分比变量改为double) - 边界处理:增加总支出为0的判断,避免除以0的运行时异常
- 访问方法补充:添加各类别百分比的getter方法,方便饼图模块调用
内容的提问来源于stack exchange,提问作者NSV.
相关产品推荐
相关产品推荐

