BigDecimal进行除法运算时的坑

Posted east7

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BigDecimal进行除法运算时的坑相关的知识,希望对你有一定的参考价值。

 

循环小数输出的坑

  BigDecimal做除法时如果出现除不尽(循环小数)的情况,会抛异常:

BigDecimal a = new BigDecimal("1");
System.out.println(a.divide(new BigDecimal(3)));

   异常如下:

Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
       at java.math.BigDecimal.divide(BigDecimal.java:1693) 
  解决办法:使用如下两个函数设置精度
  • divide(num, scale)
  • divide(num, scale, roundingMode)
System.out.println(a.divide(new BigDecimal(30), 2,BigDecimal.ROUND_HALF_UP)); 

构造函数的坑

  先看下面这段代码: 
public static void main(String[] args) {
    BigDecimal value1 =new BigDecimal(1024.511);
    System.out.println("value1: " + value1);
    BigDecimal value2 = new BigDecimal("1024.511");
    System.out.println("value2: " + value2);
}

    按照我们的预想,value1输出的应该是10.511,可是实际的值却不是这样,如下: 

value1: 10.510999999999999232613845379091799259185791015625
value2: 10.511 
    当我们用double类型的数据作为参数时,构造出的 BigDecimal 对象 value1 并不能保证数据的准确性。而用 String 作为参数构造对象时,数据丝毫不差。 

Reference

 

以上是关于BigDecimal进行除法运算时的坑的主要内容,如果未能解决你的问题,请参考以下文章

关于BigDecimal类型在jsp页面中进行除法运算问题

bigdecimal类型除法问题

java中 BigDecimal的类型的除法

日常记录——对BigDecimal除法运算时遇到的Bug

日常记录——对BigDecimal除法运算时遇到的Bug

数字精确运算BigDecimal经常用法