java BigDecimal 计算相关


	private static final String PATTERN = "0.00";
	private static final String PATTERN_WITHOUT_SCALE = "0";
	private static final DecimalFormat FORMAT_WITHOUT_SCALE = new DecimalFormat(PATTERN_WITHOUT_SCALE);
	private static final DecimalFormat FORMAT = new DecimalFormat(PATTERN);
	static {
		FORMAT.setRoundingMode(RoundingMode.HALF_UP);
		FORMAT_WITHOUT_SCALE.setRoundingMode(RoundingMode.HALF_UP);
	}

	/**
	 * 小数点后位数
	 */
	private static final int SCALE = 2;

	/**
	 * <p>转换double类型数据到BigDecimal类型.</p>
	 * 
	 * @param value Double类型的数据
	 * @return BigDecimal类型数据
	 */
	public static BigDecimal format(final double value) {
		return (new BigDecimal(FORMAT.format(value)));
	}

	/**
	 * <p>转换long类型数据到BigDecimal类型.</p>
	 * 
	 * @param value Double类型的数据
	 * @return BigDecimal类型数据
	 */
	public static BigDecimal format(final long value) {
		return (new BigDecimal(FORMAT.format(value)));
	}

	public static BigDecimal formatWithoutScale(final BigDecimal value) {
		return (new BigDecimal(FORMAT_WITHOUT_SCALE.format(value)));
	}

	/**
	 * <p>格式化BigDecimal类型的数值.</p>
	 * 
	 * @param value BigDecimal类型的数据
	 * @return BigDecimal类型数据
	 */
	public static BigDecimal format(final BigDecimal value) {
		return value.setScale(SCALE, BigDecimal.ROUND_HALF_UP);
	}

	/**
	 * <p>BigDecimal加法运算.</p>
	 * 
	 * @param d1 加数
	 * @param d2 加数
	 * @return BigDecimal类型
	 */
	public static BigDecimal add(final BigDecimal d1, final BigDecimal d2) {
		return format(d1.add(d2));
	}

	/**
	 * <p>多个BigDecimal类型的数据相加.</p>
	 * 
	 * @param v1
	 * @param vs
	 * @return
	 */
	public static BigDecimal add(final BigDecimal v1, final BigDecimal... vs) {
		BigDecimal sum = BigDecimal.ZERO;
		for (final BigDecimal v : vs) {
			sum = add(sum, v);
		}
		return add(v1, sum);
	}
	
	/**
	 * <p>多个BigDecimal类型的数据相加.保留固定位数小数</p>
	 * 
	 * @param num
	 * @param vs
	 * @return
	 */
	public static BigDecimal add(final int num, final BigDecimal... vs) {
		BigDecimal sum = BigDecimal.ZERO;
		for (final BigDecimal v : vs) {
			sum = sum.add(v);
		}
		return format(sum,num);
	}

	/**
	 * <p>多个BigDecimal类型的数据连减.</p>
	 * 
	 * @param v1
	 * @param vs
	 * @return
	 */
	public static BigDecimal subtract(final BigDecimal v1, final BigDecimal... vs) {
		final BigDecimal sum = add(BigDecimal.ZERO, vs);
		return subtract(v1, sum);
	}

	/**
	 * <p>BigDecimal减法运算.</p>
	 * 
	 * @param d1 运算数
	 * @param d2 运算数
	 * @return BigDecimal类型
	 */
	public static BigDecimal subtract(final BigDecimal d1, final BigDecimal d2) {
		return format(d1.subtract(d2));
	}

	private static int compareBigDecimal(final BigDecimal v1, final BigDecimal v2) {
		return (format(v1).compareTo(format(v2)));
	}

	/**
	 * 
	 * <p>大于.</p>
	 * 
	 * @param v1
	 * @param v2
	 * @return
	 */
	public static boolean gt(final BigDecimal v1, final BigDecimal v2) {
		return compareBigDecimal(v1, v2) > 0;
	}

	/**
	 * <p>大于等于.</p>
	 * 
	 * @param v1
	 * @param v2
	 * @return
	 */
	public static boolean ge(final BigDecimal v1, final BigDecimal v2) {
		return compareBigDecimal(v1, v2) >= 0;
	}

	/**
	 * <p>等于.</p>
	 * 
	 * @param v1
	 * @param v2
	 * @return
	 */
	public static boolean eq(final BigDecimal v1, final BigDecimal v2) {
		return compareBigDecimal(v1, v2) == 0;
	}

	/**
	 * <p>小于.</p>
	 * 
	 * @param v1
	 * @param v2
	 * @return
	 */
	public static boolean lt(final BigDecimal v1, final BigDecimal v2) {
		return compareBigDecimal(v1, v2) < 0;
	}

	/**
	 * <p>小于等于.</p>
	 * 
	 * @param v1
	 * @param v2
	 * @return
	 */
	public static boolean le(final BigDecimal v1, final BigDecimal v2) {
		return compareBigDecimal(v1, v2) <= 0;
	}

	/**
	 * <p>不等于.</p>
	 * 
	 * @param v1
	 * @param v2
	 * @return
	 */
	public static boolean ne(final BigDecimal v1, final BigDecimal v2) {
		return compareBigDecimal(v1, v2) != 0;
	}

	/**
	 * <p>除法操作.</p>
	 * 
	 * @param v1
	 * @param v2
	 * @return
	 */
	public static BigDecimal divide(final BigDecimal v1, final BigDecimal v2) {
		return v1.divide(v2, SCALE,BigDecimal.ROUND_HALF_UP);
		//return format(v1.divide(v2));
	}

	/** 乘法操作 */
	public static BigDecimal multiply(final BigDecimal v1, final BigDecimal v2) {
		return format(v1.multiply(v2));
	}
        /**
	 * <p>多个BigDecimal类型的数据相乘.</p>
	 * 
	 * @param v1
	 * @param vs
	 * @return
	 */
	public static BigDecimal multiply(final BigDecimal v1, final BigDecimal... vs) {
		BigDecimal sum = v1;
		for (final BigDecimal v : vs) {
			sum = sum.multiply(v);
		}
		return sum.setScale(SCALE, BigDecimal.ROUND_HALF_UP);
	}
	/*=========新增带位数的格式化================*/
	public static BigDecimal format(BigDecimal value,int num){
		return value.setScale(num, BigDecimal.ROUND_HALF_UP);
	}

    /**
	 * <p>BigDecimal加法运算.</p>
	 * 
	 * @param d1 加数
	 * @param d2 加数
	 * @return BigDecimal类型
	 */
	public static BigDecimal add(final BigDecimal d1, final BigDecimal d2,final int num) {
		return format(d1.add(d2),num);
	}
	/**
	 * <p>BigDecimal减法运算.</p>
	 * 
	 * @param d1 运算数
	 * @param d2 运算数
	 * @return BigDecimal类型
	 */
	public static BigDecimal subtract(final BigDecimal d1, final BigDecimal d2,final int num) {
		return format(d1.subtract(d2),num);
	}

	private static int compareBigDecimal(final BigDecimal v1, final BigDecimal v2,final int num) {
		return (format(v1,num).compareTo(format(v2,num)));
	}
	
	/** 乘法操作 */
	public static BigDecimal multiply(final BigDecimal v1, final BigDecimal v2,final int num) {
		return format(v1.multiply(v2),num);
	}
    /**
	 * <p>多个BigDecimal类型的数据相乘.保留固定位数小数</p>
	 * 
	 * @param v1
	 * @param vs
	 * @return
	 */
	public static BigDecimal multiply(final int num, final BigDecimal v1,final BigDecimal... vs) {
		BigDecimal sum = v1;
		for (final BigDecimal v : vs) {
			sum = sum.multiply(v);
		}
		return sum.setScale(num, BigDecimal.ROUND_HALF_UP);
	}
	/**
	 * <p>除法操作.</p>
	 * 
	 * @param v1
	 * @param v2
	 * @return
	 */
	public static BigDecimal divide(final BigDecimal v1, final BigDecimal v2,final int num) {
		return v1.divide(v2, num,BigDecimal.ROUND_HALF_UP);
	}
	//比较相关
	/**
	 * 
	 * <p>大于.</p>
	 * 
	 * @param v1
	 * @param v2
	 * @return
	 */
	public static boolean gt(final BigDecimal v1, final BigDecimal v2,final int num) {
		return compareBigDecimal(v1, v2,num) > 0;
	}
	/**
	 * <p>大于等于.</p>
	 * 
	 * @param v1
	 * @param v2
	 * @return
	 */
	public static boolean ge(final BigDecimal v1, final BigDecimal v2,final int num) {
		return compareBigDecimal(v1, v2,num) >= 0;
	}

	/**
	 * <p>等于.</p>
	 * 
	 * @param v1
	 * @param v2
	 * @return
	 */
	public static boolean eq(final BigDecimal v1, final BigDecimal v2,final int num) {
		return compareBigDecimal(v1, v2,num) == 0;
	}

	/**
	 * <p>小于.</p>
	 * 
	 * @param v1
	 * @param v2
	 * @return
	 */
	public static boolean lt(final BigDecimal v1, final BigDecimal v2,final int num) {
		return compareBigDecimal(v1, v2,num) < 0;
	}

	/**
	 * <p>小于等于.</p>
	 * 
	 * @param v1
	 * @param v2
	 * @return
	 */
	public static boolean le(final BigDecimal v1, final BigDecimal v2,final int num) {
		return compareBigDecimal(v1, v2,num) <= 0;
	}

	/**
	 * <p>不等于.</p>
	 * 
	 * @param v1
	 * @param v2
	 * @return
	 */
	public static boolean ne(final BigDecimal v1, final BigDecimal v2,final int num) {
		return compareBigDecimal(v1, v2,num) != 0;
	}
	/**
	 * <p>null处理</p>
	 * 
	 * @param v
	 * @return
	 */
	public static BigDecimal formatNullToZero(BigDecimal v){
		return v==null?BigDecimal.ZERO:v;
	}

	/**
	 * <p>null处理</p>
	 * 
	 * @param v
	 * @return
	 */
	public static BigDecimal formatNullToZero(String v){
		v = StringFilter.getStringValue(v);
		return "".equalsIgnoreCase(v)?BigDecimal.ZERO:new BigDecimal(v);
	}

 

### Java BigDecimal 计算使用方法示例 在 Java 中,`BigDecimal` 是用于高精度计算的类,特别是在金融领域或其他需要精确小数点运算的地方。以下是一个完整的 `BigDecimal` 使用示例,展示如何进行加法、减法、乘法和除法操作,并设置精度。 ```java import java.math.BigDecimal; import java.math.RoundingMode; public class BigDecimalExample { public static void main(String[] args) { // 创建 BigDecimal 对象 BigDecimal a = new BigDecimal("10.25"); BigDecimal b = new BigDecimal("3.75"); // 加法操作 BigDecimal sum = a.add(b); System.out.println("加法结果: " + sum); // 减法操作 BigDecimal difference = a.subtract(b); System.out.println("减法结果: " + difference); // 乘法操作 BigDecimal product = a.multiply(b); System.out.println("乘法结果: " + product); // 除法操作,注意需要指定精度和舍入模式 BigDecimal quotient = a.divide(b, 4, RoundingMode.HALF_UP); System.out.println("除法结果(四舍五入到小数点后四位): " + quotient); // 设置小数点后两位,使用四舍五入模式 BigDecimal roundedSum = sum.setScale(2, RoundingMode.HALF_UP); System.out.println("加法结果四舍五入后: " + roundedSum); } } ``` 上述代码展示了如何使用 `BigDecimal` 进行基本的数学运算,并通过 `setScale` 方法设置结果的小数位数[^1]。 需要注意的是,在创建 `BigDecimal` 对象时,推荐使用字符串形式的构造函数或 `BigDecimal.valueOf` 方法,以避免浮点数精度问题[^2]。例如: ```java BigDecimal b1 = new BigDecimal("0.1"); // 推荐方式 BigDecimal b2 = BigDecimal.valueOf(0.1); // 推荐方式 BigDecimal b3 = new BigDecimal(0.1); // 不推荐,可能引入精度误差 ``` #### 关键点说明 - **加法**:通过 `add` 方法实现。 - **减法**:通过 `subtract` 方法实现。 - **乘法**:通过 `multiply` 方法实现。 - **除法**:通过 `divide` 方法实现,但需要注意指定精度和舍入模式,否则可能会抛出异常。 - **精度控制**:通过 `setScale` 方法设置小数位数,并指定舍入模式。 ### 注意事项 当使用 `BigDecimal` 时,务必注意以下几点: 1. 避免直接使用浮点数作为构造参数,因为这可能导致精度问题。 2. 在执行除法操作时,必须明确指定结果的小数位数和舍入模式,以避免无限循环小数引发的异常。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值