欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

BigDecimal 类的使用介绍

程序员文章站 2024-03-14 19:54:41
...

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

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

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

BigDecimal – 加减乘除

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 – 除法

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

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

改善做法

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

总结

BigDecimal 类的使用介绍

相关标签: java学习