工具类篇【二】BigDecimal计算

工具类篇大全

工具类篇【一】String字符串

工具类篇【二】BigDecimal计算

工具类篇【三】日期Date转换

工具类篇【四】日志脱敏

工具类篇【五】Random随机生成字符串

工具类篇【六】克隆对象的2种常用方法


 

前言

BigDecimal作为Java中常用的金额计算类,由于金额计算涉及小数点甚至四舍五入计数法等。其他数据类型如:Double、Float、Integer、Long等都不能作为一个企业的标准金额计算工具。经常有人用除BigDecimal以外的其他类型计算金额,导致计算结果有误,要么少了小数点,要么多了小数点,要么报错等等。因此,作为一名合格的程序员,强调用BigDecimal作为基本金额计算类显得尤为重要。

一、BigDecimal、Double、String互转

入参为Double,返回小数点后指定位数的数值

public static Double setScaleUp(Double value, int scale) {

		BigDecimal bd = BigDecimal.valueOf(value.doubleValue());
		return Double.valueOf(bd.setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue());
	}

获取指定小数点位数的值,并四舍五入

	/** 截取小数点位
	 *  @author 
	 *	@DateTime 2018年10月16日 上午9:58:52
	 *
	 *  @param value
	 *  @param scale
	 *  @return
	 */
	public static BigDecimal setScaleByBigDecimalDown(BigDecimal value, int scale) {
		return value.setScale(scale, BigDecimal.ROUND_DOWN);
	}

Double转Bigdecimal

	public static BigDecimal convertDoubleToBigdecimal(Double d1) {
		return BigDecimal.valueOf(d1 == null ? 0 : d1);
	}

BigDecimal转Double

	/**
	 * 转换BigDecimal 到double
	 * @author 
	 * @DateTime 2017年11月11日 上午10:14:44
	 *
	 * @param bigDecimal
	 * @return
	 */
	public static Double convertBigDecimalToDouble(BigDecimal bigDecimal) {
		return bigDecimal == null ? null : bigDecimal.doubleValue();
	}

String转BigDecimal

public static BigDecimal converStringToBigdecimal(String st, int scale) {
		if (StringUtils.isEmpty(st)) {
			return BigDecimal.ZERO;
		} else {
			return FcsNumberUtils.setScaleOfBigDecimal(new BigDecimal(st), scale);
		}
	}

BigDecimal转String

	public static String bigdecimalToString(BigDecimal b1) {

		if (b1 == null) {
			return "0";
		} else {
			return b1.toString();
		}
	}

Double转String

	public static String doubleToString(Double b1) {

		if (b1 == null) {
			return "0";
		} else {
			return b1.toString();
		}
	}

BigDecimal转Long

    public static Long convertBigDecimalToLong(BigDecimal bigDecimal) {
        return bigDecimal == null ? null : bigDecimal.longValue();
    }

二、常用计算方法

BigDecimal比较大小

    /**
	 * @author 
	 * @DateTime 2018年1月16日 上午10:37:55
	 *
	 * @param b1
	 * @param b2
	 * @return
	 */
	public static boolean compareToOnBigDecimal(BigDecimal b1, BigDecimal b2) {

		if (b1 == null) {
			b1 = BigDecimal.ZERO;
		}
		if (b2 == null) {
			b2 = BigDecimal.ZERO;
		}
		if (b1.compareTo(b2) == 0) {
			return true;
		} else {
			return false;
		}
	}

BigDecimal加法计算

	public static BigDecimal addOfBigDecimal(BigDecimal d1, BigDecimal d2, int scale) {

		if (d1 == null) {
			d1 = BigDecimal.ZERO;
		}
		if (d2 == null) {
			d2 = BigDecimal.ZERO;
		}
		return FcsNumberUtils.addOfBigDecimal(d1, d2, scale);
	}

BigDecimal减法计算

	/**
	 *  @author  
	 *	@DateTime 2018年3月23日 下午5:30:06
	 *
	 *  @param d1
	 *  @param d2
	 *  @param scale
	 *  @return
	 */
	public static BigDecimal subtractOfBigDecimal(BigDecimal d1, BigDecimal d2, int scale) {

		if (d1 == null) {
			d1 = BigDecimal.ZERO;
		}
		if (d2 == null) {
			d2 = BigDecimal.ZERO;
		}
		if (scale <= 0) {
			scale = 2;
		}
		BigDecimal bd = d1.subtract(d2);
		return bd.setScale(scale, BigDecimal.ROUND_HALF_UP);
	}

BigDecimal乘法计算

    public static BigDecimal multiplyOfBigDecimal(BigDecimal d1, BigDecimal d2, int scale) {
        return multiplyOfBigDecimal(d1, d2).setScale(scale, 4);
    }

    public static BigDecimal multiplyOfBigDecimal(BigDecimal d1, BigDecimal d2) {
        return d1.multiply(d2);
    }

BigDecimal除法计算


    public static BigDecimal divideOfBigDecimal(BigDecimal d1, BigDecimal d2, int scale) {
        return divideOfBigDecimal(d1, d2).setScale(scale, 4);
    }

    public static BigDecimal divideOfBigDecimal(BigDecimal d1, BigDecimal d2) {
        return d1.divide(d2, 16, 4);
    }

Double加法计算

	public static Double addOfDouble(Double d1, Double d2, int scale) {

		if (d1 == null) {
			d1 = 0.00D;
		}

		if (d2 == null) {
			d2 = 0.00D;
		}

		Double result = FcsNumberUtils.add(d1, d2, scale);

		return (result.doubleValue() == 0.00) ? null : result;
	}

Double是否相等判断

	/**
	 * @author 
	 * @DateTime 2017年8月24日 下午1:48:52
	 *
	 * @param d1
	 * @param d2
	 * @return
	 */
	public static boolean doubleIsEquals(Double d1, Double d2) {

		if (d1 == null) {
			d1 = 0.00d;
		}

		if (d2 == null) {
			d2 = 0.00d;
		}

		BigDecimal dd1 = BigDecimal.valueOf(setScaleUp(d1, 2));
		BigDecimal dd2 = BigDecimal.valueOf(setScaleUp(d2, 2));
		int retval = dd1.compareTo(dd2);

		if (retval == 0) {
			return true;
		} else {
			return false;
		}
	}

Double减法计算

	/**
	 *  @author 
	 *	@DateTime 2018年3月23日 下午5:30:06
	 *
	 *  @param d1
	 *  @param d2
	 *  @param scale
	 *  @return
	 */
	public static Double subtractOfBigDouble(Double d1, Double d2, int scale) {

		if (d1 == null) {
			d1 = new Double(0);
		}

		if (d2 == null) {
			d2 = new Double(0);
		}

		if (scale <= 0) {
			scale = 2;
		}
		return FcsNumberUtils.subtract(d1, d2, scale);

	}

Double乘法计算

    public static Double multiply(Double d1, Double d2, int scale) {
        return BigDecimal.valueOf(multiply(d1, d2)).setScale(scale, 4).doubleValue();
    }

Double除法计算

    public static Double divide(Double d1, Double d2, int scale) {
        return BigDecimal.valueOf(divide(d1, d2)).setScale(scale, 4).doubleValue();
    }

BigDecimal绝对值

	public static BigDecimal negateByBigDecimal(BigDecimal bigdecimal) {
		if (bigdecimal == null) {
			return null;
		}
		return bigdecimal.negate();
	}

三、总结

在开发中,一个项目总会需要涉及到计算,如金额的计算、数字的计算、计数等。一旦涉及到计算就会少不了要使用以上类和工具。整理和定义一个工具类,将为编码工作省下极大的便利。工欲善其事必先利其器。


既然都看完了整篇文章,相信对你一定有所帮助。原创不易,勿做伸手党。

点击下方【打赏】小编,或者关注公众号给予支持,你们的每一份鼓励都将是小编伟大的动力。


同名原创公众号:    程序大视界

 

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序大视界

原创不易,请给点支持和鼓励吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值