BigDecimal 类的使用介绍

BigDecimal 是java小数操作的一个专有类,在电商、金融行业跟金额有关的字段经常被广泛使用。

疑问:java中明明已经有了 float 、double 这种精度的小数,为什么还需要 BigDecimal 呢?

举个栗子:
在这里插入图片描述
控制台输出结果:0.42857142857142855
在小数操作中,我们通常希望能有多种精度自定义的方式,例如在不同的场景可能需要返回0.4、0.42、0.43、0.4285…不同的精度,在不同的精度进位时,希望能自主控制。
此时,BigDecimal 就可以闪亮登场了!

BigDecimal – 加减乘除

在这里插入图片描述控制台输出结果:
在这里插入图片描述
在了解了BigDecimal基本内容后,在去深入的去使用它的精度

BigDecimal – 精度控制

精度有7种模式,举例如下

	@Test
	public void testRound() {
		// 正无穷大方向取整
	    System.out.println("celling:" + new BigDecimal(0.125, new MathContext(2, RoundingMode.CEILING)));
	    // 负无穷大方向取整
	    System.out.println("floor:" + new BigDecimal(0.125, new MathContext(2, RoundingMode.FLOOR)));
	    //向 0 的方向取整
	    System.out.println("down a:" + new BigDecimal(0.121, new MathContext(2, RoundingMode.DOWN)));
	    System.out.println("down b:" + new BigDecimal(-0.129, new MathContext(2, RoundingMode.DOWN)));
	    // 正数向正无穷大取整,负数向负无穷大取整
	    System.out.println("up a:" + new BigDecimal(0.121, new MathContext(2, RoundingMode.UP)));
	    System.out.println("up b:" + new BigDecimal(-0.129, new MathContext(2, RoundingMode.UP)));
	    /**
	     * 5,6,7,8,9 向上取整
	     * 1,2,3,4 向下取整
	     * 常用的4舍5入
	     */
	    System.out.println("half up:" + new BigDecimal(0.125, new MathContext(2, RoundingMode.HALF_UP)));
	    /**
	     * 6,7,8,9 向上取整
	     * 1,2,3,4,5 向下取整
	     * 5 向下取整
	     */
	    System.out.println("half down:" + new BigDecimal(0.125, new MathContext(2, RoundingMode.HALF_DOWN)));
	    /**
	     * 小数位是5时,判断整数部分是奇数就进位
	     * 1,2,3,4,  舍弃
	     * 6,7,8,9,  进位
	     */
	    System.out.println("odd a:" + new BigDecimal(5.4, new MathContext(1, RoundingMode.HALF_EVEN)));
	    System.out.println("odd b:" + new BigDecimal(5.5, new MathContext(1, RoundingMode.HALF_EVEN)));
	    /**
	     * 小数位是5时,判断整数部分是偶数就舍弃
	     * 1,2,3,4,  舍弃
	     * 6,7,8,9,  进位
	     */
	    System.out.println("even a:" + new BigDecimal(6.5, new MathContext(1, RoundingMode.HALF_EVEN)));
	    System.out.println("even b:" + new BigDecimal(6.6, new MathContext(1, RoundingMode.HALF_EVEN)));
	}

控制台输出内容如下
在这里插入图片描述

BigDecimal – 除法

使用BigDecimal最重要的2大原因:
1、精度准确
2、除法运算支持好

所以一定要对除法进行深入了解,才能再实际开发场景中用到不会陌生
在这里插入图片描述
报错出现异常:
在这里插入图片描述解释:因为 5.4、3.1都是double类型转换的 BigDecimal。
实际上5.4在内存中可能是 5.40000003321546546 的内容。导致BigDecimal内部精度计算的时候,发生错误
这个错误是因为没有指定精度导致的,我们只要指定了结果的精度,就可以避免这个问题

改善做法

在这里插入图片描述控制台输出:divide:1.74
我们额外传入第二个参数:保留的小数,指定了结果的精度,就可以避免出现这种问题。
所以我们日常用BigDecimal做除法运算的时候,务必写成推荐的形式。避免出现了异常,自己还莫名其妙

总结

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值