数字精度运算工具类

发布时间 2024-01-10 16:07:56作者: 码小白很犇
package com.dem.ceshiDemo.util;

import java.math.BigDecimal;
import java.util.regex.Pattern;

/**
 * 数字精度运算工具类
 */
public class NumberUtils {

	/**
	 * 减法运算(精度)
	 * @param num1 被减数
	 * @param num2 减数
	 * @return 差
	 *
	 */
	public static double subtract(double num1, double num2) {
		BigDecimal bignum1 = new BigDecimal(Double.toString(num1));
		BigDecimal bignum2 = new BigDecimal(Double.toString(num2));
		return bignum1.subtract(bignum2).doubleValue();
	}

	/**
	 * 加法运算(精度)
	 * @param num1 
	 * @param num2
	 * @return 两个数字之和
	 *
	 */
	public static double add(double num1, double num2) {
		BigDecimal bignum1 = new BigDecimal(Double.toString(num1));
		BigDecimal bignum2 = new BigDecimal(Double.toString(num2));
		return bignum1.add(bignum2).doubleValue();
	}
	
	/**
	 * 除法运算(精度)
	 * @param num1 被除数
	 * @param num2 除数
	 * @return 商
	 *
	 */
	public static double divide(double num1, double num2) {
		BigDecimal big1 = new BigDecimal(Double.toString(num1));
		BigDecimal big2 = new BigDecimal(Double.toString(num2));
		return big1.divide(big2).doubleValue();
	}
	
	/**
	 * 除法运算(精度),并保留小数位数
	 * @param num1 被除数
	 * @param num2 除数
	 * @param scale 保留小数位数
	 * @return 商
	 *
	 */
	public static double divide(double num1, double num2, int scale) {
		if (scale < 0) {
			throw new IllegalArgumentException(" 截取位数必须是正整数或者零 ");
		}

		BigDecimal big1 = new BigDecimal(Double.toString(num1));
		BigDecimal big2 = new BigDecimal(Double.toString(num2));
		return big1.divide(big2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
	}
	
	/**
	 * 乘法运算(精度)
	 * @param num1 被乘数
	 * @param num2 乘数
	 * @return 积
	 *
	 */
	public static double multiply(double num1, double num2) {
		BigDecimal big1 = new BigDecimal(Double.toString(num1));
		BigDecimal big2 = new BigDecimal(Double.toString(num2));
		return big1.multiply(big2).doubleValue();
	}

	/**
	 * 乘法运算(精度),并保留小数位数
	 * @param num1 被乘数
	 * @param num2 乘数
	 * @param scale 保留小数位数
	 * @return 积
	 *
	 */
	public static double multiply(double num1, double num2, int scale) {
		if (scale < 0) {
			throw new IllegalArgumentException(" 截取位数必须是正整数或者零  ");
		}
		BigDecimal big1 = new BigDecimal(Double.toString(num1));
		BigDecimal big2 = new BigDecimal(Double.toString(num2));
		return big1.multiply(big2).setScale(scale, BigDecimal.ROUND_HALF_UP)
				.doubleValue();
	}
	
	/**
	 * 数字取整
	 * @param num1 待处理的数字
	 * @return 去掉小数位后的数值
	 *
	 */
	public static double integer(double num1){
		return Math.floor(num1);
	}

	/**
	 * 数字进行四舍五入
	 * @param num1 待处理的数字
	 * @param scale 位数
	 * @return 四舍五入后的数字
	 *
	 */
	public static double round(double num1, int scale) {
		if (scale < 0) {
			throw new IllegalArgumentException("截取位数必须是正整数或者零 ");
		}
		BigDecimal b = new BigDecimal(Double.toString(num1));
		return b.setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
	}

	/*方法二:推荐,速度最快
	 * 判断是否为整数
	 * @param str 传入的字符串
	 * @return 是整数返回true,否则返回false
	 */

	public static boolean isInteger(String str) {
		Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$");
		return pattern.matcher(str).matches();
	}

}