zepengdev
2025-06-26 97a55d2e9a7e6ee36d95e08731dd374f5fd93fa1
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package com.oying.utils;
 
import java.math.BigDecimal;
import java.math.RoundingMode;
 
/**
 * @author Z
 * @description 计算类
 * @date 2024-12-27
 **/
public class BigDecimalUtils {
 
    /**
     * 将对象转换为 BigDecimal
     * @param obj 输入对象
     * @return 转换后的 BigDecimal
     */
    private static BigDecimal toBigDecimal(Object obj) {
        if (obj instanceof BigDecimal) {
            return (BigDecimal) obj;
        } else if (obj instanceof Long) {
            return BigDecimal.valueOf((Long) obj);
        } else if (obj instanceof Integer) {
            return BigDecimal.valueOf((Integer) obj);
        } else if (obj instanceof Double) {
            return new BigDecimal(String.valueOf(obj));
        } else {
            throw new IllegalArgumentException("Unsupported type");
        }
    }
 
    /**
     * 加法
     * @param a 加数
     * @param b 加数
     * @return 两个加数的和,保留两位小数
     */
    public static BigDecimal add(Object a, Object b) {
        BigDecimal bdA = toBigDecimal(a);
        BigDecimal bdB = toBigDecimal(b);
        return bdA.add(bdB).setScale(2, RoundingMode.HALF_UP);
    }
 
    /**
     * 减法
     * @param a 被减数
     * @param b 减数
     * @return 两数的差,保留两位小数
     */
    public static BigDecimal subtract(Object a, Object b) {
        BigDecimal bdA = toBigDecimal(a);
        BigDecimal bdB = toBigDecimal(b);
        return bdA.subtract(bdB).setScale(2, RoundingMode.HALF_UP);
    }
 
    /**
     * 乘法
     * @param a 乘数
     * @param b 乘数
     * @return 两个乘数的积,保留两位小数
     */
    public static BigDecimal multiply(Object a, Object b) {
        BigDecimal bdA = toBigDecimal(a);
        BigDecimal bdB = toBigDecimal(b);
        return bdA.multiply(bdB).setScale(2, RoundingMode.HALF_UP);
    }
 
    /**
     * 除法
     * @param a 被除数
     * @param b 除数
     * @return 两数的商,保留两位小数
     */
    public static BigDecimal divide(Object a, Object b) {
        BigDecimal bdA = toBigDecimal(a);
        BigDecimal bdB = toBigDecimal(b);
        return bdA.divide(bdB, 2, RoundingMode.HALF_UP);
    }
 
    /**
     * 除法
     * @param a 被除数
     * @param b 除数
     * @param scale 保留小数位数
     * @return 两数的商,保留两位小数
     */
    public static BigDecimal divide(Object a, Object b, int scale) {
        BigDecimal bdA = toBigDecimal(a);
        BigDecimal bdB = toBigDecimal(b);
        return bdA.divide(bdB, scale, RoundingMode.HALF_UP);
    }
 
    /**
     * 分转元
     * @param obj 分的金额
     * @return 转换后的元,保留两位小数
     */
    public static BigDecimal centsToYuan(Object obj) {
        BigDecimal cents = toBigDecimal(obj);
        return cents.divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP);
    }
 
    /**
     * 元转分
     * @param obj 元的金额
     * @return 转换后的分
     */
    public static Long yuanToCents(Object obj) {
        BigDecimal yuan = toBigDecimal(obj);
        return yuan.multiply(BigDecimal.valueOf(100)).setScale(0, RoundingMode.HALF_UP).longValue();
    }
 
    public static void main(String[] args) {
        BigDecimal num1 = new BigDecimal("10.123");
        BigDecimal num2 = new BigDecimal("2.456");
 
        System.out.println("加法结果: " + add(num1, num2));
        System.out.println("减法结果: " + subtract(num1, num2));
        System.out.println("乘法结果: " + multiply(num1, num2));
        System.out.println("除法结果: " + divide(num1, num2));
 
        Long cents = 12345L;
        System.out.println("分转元结果: " + centsToYuan(cents));
 
        BigDecimal yuan = new BigDecimal("123.45");
        System.out.println("元转分结果: " + yuanToCents(yuan));
    }
}