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