我的BigDecimal工具类

我的BigDecimal工具类

前言

将我项目中所使用的BigDecimal工具类记录下来,方便以后使用。

引用

链接: 精确的数据类型BigDecimal和工具类.
我的工具类是在此文章的基础上进行修改、添加的。

工具类代码

工具类中我修改了的double类型转为BigDecimal类型时的方法。
new BigDecimal(Double.toString(v1))变为BigDecimal.valueOf(v1)
因为idea提示
禁止使用构造方法BigDecimal(double)的方式把double值转化为BigDecimal对象
说明:反编译出的字节码文件显示每次循环都会new出一个StringBuilder对象,然后进行append操作,最后通过toString方法返回String对象,造成内存资源浪费。
添加了equals方法判断是否相等,后来突然想到传入参数为String类型,那我为什么不直接用String.equals()。
(⊙︿⊙)(⊙︿⊙)(⊙︿⊙)
于是我添加了double类型与BigDecimal类型的equals方法,强行挽尊。(╹▽╹)(╹▽╹)(╹▽╹)

import java.math.BigDecimal;

/**
 * @Description: TODO 用于高精确处理常用的数学运算
 * @Date: 2023-11-30 10:02
 * @Version: 1.0
 */
public class ArithmeticUtils {
	/**
	 * 默认除法运算精度
	 */
	private static final int DEF_DIV_SCALE = 10;

	/**
	 * 提供精确的加法运算
	 *
	 * @param v1 被加数
	 * @param v2 加数
	 * @return 两个参数的和
	 */
	public static double add(double v1, double v2) {

		BigDecimal b1 = BigDecimal.valueOf(v1);
		BigDecimal b2 = BigDecimal.valueOf(v2);
		return b1.add(b2).doubleValue();
	}

	/**
	 * 提供精确的加法运算
	 *
	 * @param v1 被加数
	 * @param v2 加数
	 * @return 两个参数的和
	 */
	public static BigDecimal add(String v1, String v2) {
		BigDecimal b1 = new BigDecimal(v1);
		BigDecimal b2 = new BigDecimal(v2);
		return b1.add(b2);
	}

	/**
	 * 提供精确的加法运算
	 *
	 * @param v1    被加数
	 * @param v2    加数
	 * @param scale 保留scale 位小数
	 * @return 两个参数的和
	 */
	public static String add(String v1, String v2, int scale) {
		if (scale < 0) {
			throw new IllegalArgumentException(
					"The scale must be a positive integer or zero");
		}
		BigDecimal b1 = new BigDecimal(v1);
		BigDecimal b2 = new BigDecimal(v2);
		return b1.add(b2).setScale(scale, BigDecimal.ROUND_HALF_UP).toString();
	}

	/**
	 * 提供精确的减法运算
	 *
	 * @param v1 被减数
	 * @param v2 减数
	 * @return 两个参数的差
	 */
	public static double sub(double v1, double v2) {
		BigDecimal b1 = BigDecimal.valueOf(v1);
		BigDecimal b2 = BigDecimal.valueOf(v2);
		return b1.subtract(b2).doubleValue();
	}

	/**
	 * 提供精确的减法运算。
	 *
	 * @param v1 被减数
	 * @param v2 减数
	 * @return 两个参数的差
	 */
	public static BigDecimal sub(String v1, String v2) {
		BigDecimal b1 = new BigDecimal(v1);
		BigDecimal b2 = new BigDecimal(v2);
		return b1.subtract(b2);
	}

	/**
	 * 提供精确的减法运算
	 *
	 * @param v1    被减数
	 * @param v2    减数
	 * @param scale 保留scale 位小数
	 * @return 两个参数的差
	 */
	public static String sub(String v1, String v2, int scale) {
		if (scale < 0) {
			throw new IllegalArgumentException(
					"The scale must be a positive integer or zero");
		}
		BigDecimal b1 = new BigDecimal(v1);
		BigDecimal b2 = new BigDecimal(v2);
		return b1.subtract(b2).setScale(scale, BigDecimal.ROUND_HALF_UP).toString();
	}

	/**
	 * 提供精确的乘法运算
	 *
	 * @param v1 被乘数
	 * @param v2 乘数
	 * @return 两个参数的积
	 */
	public static double mul(double v1, double v2) {
		BigDecimal b1 = BigDecimal.valueOf(v1);
		BigDecimal b2 = BigDecimal.valueOf(v2);
		return b1.multiply(b2).doubleValue();
	}

	/**
	 * 提供精确的乘法运算
	 *
	 * @param v1 被乘数
	 * @param v2 乘数
	 * @return 两个参数的积
	 */
	public static BigDecimal mul(String v1, String v2) {
		BigDecimal b1 = new BigDecimal(v1);
		BigDecimal b2 = new BigDecimal(v2);
		return b1.multiply(b2);
	}

	/**
	 * 提供精确的乘法运算
	 *
	 * @param v1    被乘数
	 * @param v2    乘数
	 * @param scale 保留scale 位小数
	 * @return 两个参数的积
	 */
	public static double mul(double v1, double v2, int scale) {
		BigDecimal b1 = BigDecimal.valueOf(v1);
		BigDecimal b2 = BigDecimal.valueOf(v2);
		return ArithmeticUtils.round(b1.multiply(b2).doubleValue(), scale);
	}

	/**
	 * 提供精确的乘法运算
	 *
	 * @param v1    被乘数
	 * @param v2    乘数
	 * @param scale 保留scale 位小数
	 * @return 两个参数的积
	 */
	public static String mul(String v1, String v2, int scale) {
		if (scale < 0) {
			throw new IllegalArgumentException(
					"The scale must be a positive integer or zero");
		}
		BigDecimal b1 = new BigDecimal(v1);
		BigDecimal b2 = new BigDecimal(v2);
		return b1.multiply(b2).setScale(scale, BigDecimal.ROUND_HALF_UP).toString();
	}

	/**
	 * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到
	 * 小数点以后10位,以后的数字四舍五入
	 *
	 * @param v1 被除数
	 * @param v2 除数
	 * @return 两个参数的商
	 */

	public static double div(double v1, double v2) {
		return ArithmeticUtils.div(v1, v2, ArithmeticUtils.DEF_DIV_SCALE);
	}

	/**
	 * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指
	 * 定精度,以后的数字四舍五入
	 *
	 * @param v1    被除数
	 * @param v2    除数
	 * @param scale 表示表示需要精确到小数点以后几位。
	 * @return 两个参数的商
	 */
	public static double div(double v1, double v2, int scale) {
		if (scale < 0) {
			throw new IllegalArgumentException("The scale must be a positive integer or zero");
		}
		BigDecimal b1 = BigDecimal.valueOf(v1);
		BigDecimal b2 = BigDecimal.valueOf(v2);
		return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
	}

	/**
	 * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指
	 * 定精度,以后的数字四舍五入
	 *
	 * @param v1    被除数
	 * @param v2    除数
	 * @param scale 表示需要精确到小数点以后几位
	 * @return 两个参数的商
	 */
	public static String div(String v1, String v2, int scale) {
		if (scale < 0) {
			throw new IllegalArgumentException("The scale must be a positive integer or zero");
		}
		BigDecimal b1 = new BigDecimal(v1);
		BigDecimal b2 = new BigDecimal(v1);
		return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).toString();
	}

	/**
	 * 提供精确的小数位四舍五入处理
	 *
	 * @param v     需要四舍五入的数字
	 * @param scale 小数点后保留几位
	 * @return 四舍五入后的结果
	 */
	public static double round(double v, int scale) {
		if (scale < 0) {
			throw new IllegalArgumentException("The scale must be a positive integer or zero");
		}
		BigDecimal b = new BigDecimal(Double.toString(v));
		return b.setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
	}

	/**
	 * 提供精确的小数位四舍五入处理
	 *
	 * @param v     需要四舍五入的数字
	 * @param scale 小数点后保留几位
	 * @return 四舍五入后的结果
	 */
	public static String round(String v, int scale) {
		if (scale < 0) {
			throw new IllegalArgumentException(
					"The scale must be a positive integer or zero");
		}
		BigDecimal b = new BigDecimal(v);
		return b.setScale(scale, BigDecimal.ROUND_HALF_UP).toString();
	}

	/**
	 * 取余数
	 *
	 * @param v1    被除数
	 * @param v2    除数
	 * @param scale 小数点后保留几位
	 * @return 余数
	 */
	public static String remainder(String v1, String v2, int scale) {
		if (scale < 0) {
			throw new IllegalArgumentException(
					"The scale must be a positive integer or zero");
		}
		BigDecimal b1 = new BigDecimal(v1);
		BigDecimal b2 = new BigDecimal(v2);
		return b1.remainder(b2).setScale(scale, BigDecimal.ROUND_HALF_UP).toString();
	}

	/**
	 * 取余数  BigDecimal
	 *
	 * @param v1    被除数
	 * @param v2    除数
	 * @param scale 小数点后保留几位
	 * @return 余数
	 */
	public static BigDecimal remainder(BigDecimal v1, BigDecimal v2, int scale) {
		if (scale < 0) {
			throw new IllegalArgumentException(
					"The scale must be a positive integer or zero");
		}
		return v1.remainder(v2).setScale(scale, BigDecimal.ROUND_HALF_UP);
	}

	/**
	 * 比较大小
	 *
	 * @param v1 被比较数
	 * @param v2 比较数
	 * @return 如果v1 大于v2 则 返回true 否则false
	 */
	public static boolean compare(String v1, String v2) {
		BigDecimal b1 = new BigDecimal(v1);
		BigDecimal b2 = new BigDecimal(v2);
		int bj = b1.compareTo(b2);
		boolean res;
		res = bj > 0;
		return res;
	}

	/**
	 * 是否相等
	 *
	 * @param v1 被比较数
	 * @param v2 比较数
	 * @return 如果v1 等于v2 则 返回true 否则false
	 */
	public static boolean equals(String v1, String v2) {
		return ArithmeticUtils.equals(new BigDecimal(v1), new BigDecimal(v2));
	}

	public static boolean equals(double v1, double v2) {
		return ArithmeticUtils.equals(BigDecimal.valueOf(v1), BigDecimal.valueOf(v2));
	}

	public static boolean equals(BigDecimal v1, BigDecimal v2) {
		int bj = v1.compareTo(v2);
		boolean res;
		res = bj == 0;
		return res;
	}
}

代码如有问题,请大家及时指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值