Java 精确的加减乘除运算

本文详细介绍了一种使用Java进行精确数学运算的方法,包括加法、减法、乘法、除法以及数值比较等操作。通过BigDecimal类实现了高精度的浮点数计算,解决了传统双精度浮点数运算中出现的精度损失问题。
/**
 * 
 * @author InJavaWeTrust
 *
 */
public class UtilArithmetic {
	
	/**
	 * 精确的加法运算
	 * @param d1 被加数
	 * @param d2 加数
	 * @return 两个参数的和
	 */
	public static double add(double d1, double d2) {
		BigDecimal b1 = new BigDecimal(Double.toString(d1));
		BigDecimal b2 = new BigDecimal(Double.toString(d2));
		return b1.add(b2).doubleValue();
	}
	
	/**
	 * 精确的减法运算
	 * @param d1 被减数
	 * @param d2 减数
	 * @return 两个参数的差
	 */
	public static double sub(double d1, double d2) {
		BigDecimal b1 = new BigDecimal(Double.toString(d1));
		BigDecimal b2 = new BigDecimal(Double.toString(d2));
		return b1.subtract(b2).doubleValue();
	}
	
	/**
	 * 精确的乘法运算
	 * @param d1 被乘数
	 * @param d2 乘数
	 * @return 两个参数的积
	 */
	public static double mul(double d1, double d2) {
		BigDecimal b1 = new BigDecimal(Double.toString(d1));
		BigDecimal b2 = new BigDecimal(Double.toString(d2));
		return b1.multiply(b2).doubleValue();
	}
	
	/**
	 * 精确的乘法运算,由scale参数指定精度,以后的数字四舍五入.
	 * @param d1 被乘数
	 * @param d2 乘数
	 * @param scale 需要精确到小数点以后几位
	 * @return 两个参数的积
	 */
	public static double mul2(double d1, double d2, int scale){
		BigDecimal b1 = new BigDecimal(Double.toString(d1));
		BigDecimal b2 = new BigDecimal(Double.toString(d2));
		return round(b1.multiply(b2).doubleValue(), scale);
	}

	/**
	 * (相对)精确的除法运算,当发生除不尽的情况时,
	 * 由scale参数指定精度,以后的数字四舍五入。
	 * @param d1 被除数
	 * @param d2 除数
	 * @param scale 需要精确到小数点以后几位
	 * @return 两个参数的商
	 */
    public static double div(double d1, double d2, int scale) {
        if (scale < 0) {
            throw new IllegalArgumentException(
                    "The scale must be a positive integer or zero");
        }
        BigDecimal b1 = new BigDecimal(Double.toString(d1));
        BigDecimal b2 = new BigDecimal(Double.toString(d2));
        return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    }
    
    /**
     * 判断d1是否大于d2
     * @param d1 实数1
     * @param d2 实数2
     * @return true-大于;false-小于
     */
    public static boolean isDoubleGreater(double d1, double d2) {
		boolean bn = false;
		BigDecimal b1 = new BigDecimal(Double.toString(d1));
		BigDecimal b2 = new BigDecimal(Double.toString(d2));
		if (b1.compareTo(b2) > 0) {
			bn = true;
		} else {
			bn = false;
		}
		return bn;
	}
    
    /**
     * 判断d1是否小于d2
     * @param d1 实数1
     * @param d2 实数2
     * @return true-小于;false-大于
     */
    public static boolean isDoubleLess(double d1, double d2) {
		boolean bn = false;
		BigDecimal b1 = new BigDecimal(Double.toString(d1));
		BigDecimal b2 = new BigDecimal(Double.toString(d2));
		if (b1.compareTo(b2) < 0) {
			bn = true;
		} else {
			bn = false;
		}
		return bn;
	}
    
    /**
     * 判断d1是否等于d2
     * @param d1 实数1
     * @param d2 实数2
     * @return true-等于;false-不等于
     */
    public static boolean isDoubleEqual(double d1, double d2){
    	boolean bn = false;
		BigDecimal b1 = new BigDecimal(Double.toString(d1));
		BigDecimal b2 = new BigDecimal(Double.toString(d2));
		if (b1.compareTo(b2) == 0) {
			bn = true;
		} else {
			bn = false;
		}
		return bn;
    }
    
    /**
     * 小数位四舍五入处理
     * @param d 需要四舍五入的数字
     * @param scale 小数点后保留几位
     * @return 四舍五入后的结果
     */
    public static double round(double d, int scale) {
        if (scale < 0) {
            throw new IllegalArgumentException(
                    "The scale must be a positive integer or zero");
        }
        BigDecimal b = new BigDecimal(Double.toString(d));
        BigDecimal one = new BigDecimal("1");
        return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

}

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值