package cn.iocoder.yudao.module.finance.service.asset; import java.math.BigDecimal; import java.math.RoundingMode; /** * 固定资产折旧 / 无形资产摊销的计算工具 * * 统一口径: * 1. 应计提总额(基数) = 原值 × (1 - 残值率 / 100) * 2. 月折旧额 / 月摊销额 = 应计提总额 / (年限 × 12),四舍五入保留 2 位小数 * * @author 超级管理员 */ public class FinAssetAmountUtils { private FinAssetAmountUtils() { } /** * 计算应计提总额(基数) * * @param originalValue 原值 * @param residualRate 残值率(%) * @return 应计提总额,保留 2 位小数 */ public static BigDecimal calcDepreciableBase(BigDecimal originalValue, BigDecimal residualRate) { return originalValue.multiply(BigDecimal.ONE.subtract(toResidualRatio(residualRate))) .setScale(2, RoundingMode.HALF_UP); } /** * 计算月折旧额 / 月摊销额 * * @param originalValue 原值 * @param residualRate 残值率(%) * @param years 年限(年),必须大于 0 * @return 月折旧额 / 月摊销额,保留 2 位小数 */ public static BigDecimal calcMonthlyAmount(BigDecimal originalValue, BigDecimal residualRate, int years) { BigDecimal base = originalValue.multiply(BigDecimal.ONE.subtract(toResidualRatio(residualRate))); return base.divide(BigDecimal.valueOf(years * 12L), 2, RoundingMode.HALF_UP); } /** * 残值率(%)转成计算用的比例,例如 5 -> 0.05 */ private static BigDecimal toResidualRatio(BigDecimal residualRate) { BigDecimal rate = residualRate == null ? BigDecimal.ZERO : residualRate; return rate.divide(BigDecimal.valueOf(100), 10, RoundingMode.HALF_UP); } }