gaoluyang
昨天 90b3ad820eea45d021835197eac5bc3ad55b12ed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
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);
    }
 
}