BigDecimal应用

一、BigDecimal计算

add // 加法

subtract // 减法

multiply // 乘法

divide // 除法

保留小数.setScale(0, BigDecimal.ROUND_UP)

    BigDecimal num1 = new BigDecimal("11.111");
    BigDecimal num2 = new BigDecimal("1");
    BigDecimal num3 = new BigDecimal("-11.111");
    //加法
    BigDecimal result1 = num1.add(num2);
    System.out.println("num1 + num2 = " + result1);
    //减法
    BigDecimal result2 = num1.subtract(num2);
    System.out.println("num1 - num2 = " + result2);

    //乘法
    BigDecimal result3 = num1.multiply(num2);
    System.out.println("num1 * num2 = " + result3);

    //除法(保留小数20位)
    BigDecimal result5 = num1.divide(num2,20,BigDecimal.ROUND_HALF_UP);
    System.out.println("num1 / num2 = " + result5);
  
    //绝对值
    BigDecimal result4 = num3.abs();
    System.out.println("num3的绝对值  = " + result4);

二、判断

// 判断一个数是否大于0
new BigDecimal(price).compareTo(BigDecimal.ZERO) > 0
// 判断一个数是否等于0

new BigDecimal(price).compareTo(BigDecimal.ZERO) == 0

// 判断一个数是否小于等于0
new BigDecimal(price).compareTo(BigDecimal.ZERO) <= 0
//A是否大于等于B
new BigDecimal(priceA).compareTo(new BigDecimal(priceB)) >= 0
//A是否大于等于B+C
new BigDecimal(priceA).compareTo(new BigDecimal(priceB).add(new BigDecimal(priceC))) >= 0
//A是否小于等于B+C
new BigDecimal(priceA).compareTo(new BigDecimal(priceB).add(new BigDecimal(priceC))) <= 0

三、BigDecimal(Rounding Modes)模式

new BigDecimal("4.1").setScale(0, BigDecimal.ROUND_UP)

1、ROUND_UP(向上舍入)
2、ROUND_DOWN(向下舍入)
3、ROUND_CEILING(以数轴向右舍入)
4、ROUND_FLOOR(以数轴向左舍入)
5、ROUND_HALF_UP(四舍五入)
6、ROUND_HALF_DOWN(五舍六入)
7、ROUND_HALF_EVEN(靠近偶数舍入)
8、ROUND_UNNECESSARY(断言)

计算金额时根据设计方案, 不需要四舍五入的使用ROUND_DOWN。

0.418四舍五入0.42

使用ROUND_DOWN后得出0.41

其他使用可以参考下面示例

1、ROUND_UP(向上舍入)

舍入模式从零舍入。总是对丢弃的非零分数前面的数字递增。注意,这种舍入模式不会降低计算值的大小。

System.out.println(new BigDecimal("4.1").setScale(0, BigDecimal.ROUND_UP)); // 5
System.out.println(new BigDecimal("-4.1").setScale(0, BigDecimal.ROUND_UP));// -5

2、ROUND_DOWN(向下舍入)

舍入模式向零舍入。永远不要对丢弃的分数前面的数字加1(即截断)。注意,这种舍入模式不会增加计算值的大小。 

System.out.println(new BigDecimal("4.9").setScale(0, BigDecimal.ROUND_DOWN));// 4
System.out.println(new BigDecimal("-4.9").setScale(0, BigDecimal.ROUND_DOWN));// -4

 3、ROUND_CEILING(以数轴向右舍入)

 四舍五入到正无穷大。如果BigDecimal为正数,则与ROUND_UP相同;如果为负数,则表现为ROUND_DOWN。注意,这种舍入模式不会降低计算值。

 System.out.println(new BigDecimal("4.1").setScale(0, BigDecimal.ROUND_CEILING));// 5
System.out.println(new BigDecimal("-4.9").setScale(0, BigDecimal.ROUND_CEILING));// -4

4、ROUND_FLOOR(以数轴向左舍入)

向左舍入与向右舍入恰好相反

四舍五入到负无穷。如果BigDecimal为正数,则采用与ROUND_DOWN相同的方式;如果为负数,则表现为ROUND_UP。注意,这种舍入模式不会增加计算值。

System.out.println(new BigDecimal("4.9").setScale(0, BigDecimal.ROUND_FLOOR));// 4
System.out.println(new BigDecimal("-4.1").setScale(0, BigDecimal.ROUND_FLOOR));// -5

5、ROUND_HALF_UP(四舍五入)

四舍五入模式向“最近的邻居”舍入,除非两个邻居的距离相等,这种情况下取四舍五入。如果丢弃的分数≥0.5,则表现为ROUND_UP;否则,表现为ROUND_DOWN。请注意,这是我们大多数人在小学学到的舍入模式。

System.out.println(new BigDecimal("4.4").setScale(0, BigDecimal.ROUND_HALF_UP));// 4
System.out.println(new BigDecimal("4.5").setScale(0, BigDecimal.ROUND_HALF_UP));// 5

// -4

System.out.println(new BigDecimal("-4.4").setScale(0, BigDecimal.ROUND_HALF_UP));

//-5

System.out.println(new BigDecimal("-4.5").setScale(0, BigDecimal.ROUND_HALF_UP));

6、ROUND_HALF_DOWN(五舍六入)

四舍五入模式向“最近的邻居”舍入,除非两个邻居的距离相等,在这种情况下向下舍入。如果丢弃的分数是> 0.5,则表现为ROUND_UP;否则,表现为ROUND_DOWN。

// 4
System.out.println(new BigDecimal("4.5").setScale(0, BigDecimal.ROUND_HALF_DOWN));
// 5
System.out.println(new BigDecimal("4.6").setScale(0, BigDecimal.ROUND_HALF_DOWN));
System.out.println(new BigDecimal("-4.5").setScale(0, BigDecimal.ROUND_HALF_DOWN));// -4
System.out.println(new BigDecimal("-4.6").setScale(0, BigDecimal.ROUND_HALF_DOWN));// -5

7、ROUND_HALF_EVEN(靠近偶数舍入)

舍入左边第一位是奇数,则四舍五入;左边是偶数,则五舍六入

四舍五入模式向“最近的邻居”舍入,除非两个邻居的距离相等,在这种情况下,向偶数的邻居舍入。如果丢弃的分数左边的数字是奇数,则表现为ROUND_HALF_UP;如果它是偶数,则表现为ROUND_HALF_DOWN。请注意,当在一系列计算中重复应用时,这种舍入模式能最大限度地减少累积误差。

// 4
System.out.println(new BigDecimal("4.4").setScale(0, BigDecimal.ROUND_HALF_EVEN));
// 4
System.out.println(new BigDecimal("4.5").setScale(0, BigDecimal.ROUND_HALF_EVEN));
// 5
System.out.println(new BigDecimal("4.6").setScale(0, BigDecimal.ROUND_HALF_EVEN));
// 5
System.out.println(new BigDecimal("5.4").setScale(0, BigDecimal.ROUND_HALF_EVEN));
// 6
System.out.println(new BigDecimal("5.5").setScale(0, BigDecimal.ROUND_HALF_EVEN));
// 6
System.out.println(new BigDecimal("5.6").setScale(0, BigDecimal.ROUND_HALF_EVEN));
// -4
System.out.println(new BigDecimal("-4.4").setScale(0, BigDecimal.ROUND_HALF_EVEN));
// -4
System.out.println(new BigDecimal("-4.5").setScale(0, BigDecimal.ROUND_HALF_EVEN));
// -5
System.out.println(new BigDecimal("-4.6").setScale(0, BigDecimal.ROUND_HALF_EVEN));
// -5
System.out.println(new BigDecimal("-5.4").setScale(0, BigDecimal.ROUND_HALF_EVEN));
// -6
System.out.println(new BigDecimal("-5.5").setScale(0, BigDecimal.ROUND_HALF_EVEN));
// -6
System.out.println(new BigDecimal("-5.6").setScale(0, BigDecimal.ROUND_HALF_EVEN));

8、ROUND_UNNECESSARY(断言)

舍入模式断言所请求的操作具有精确的结果,因此不需要舍入。如果在产生不精确结果的操作上指定此舍入模式,则会抛出算术异常。

// 断言计算结果包含一位小数则正常输出5.6
System.out.println(new BigDecimal("5.6").setScale(1, BigDecimal.ROUND_UNNECESSARY));

// 断言计算结果不包含小数则报错:java.lang.ArithmeticException: Rounding necessary
System.out.println(new BigDecimal("5.6").setScale(0, BigDecimal.ROUND_UNNECESSARY));

  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值