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做除法运算的时候,务必写成推荐的形式。避免出现了异常,自己还莫名其妙