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