码迷,mamicode.com
首页 > 其他好文 > 详细

BigDecimal进行除法运算时的坑

时间:2019-10-20 11:24:55      阅读:240      评论:0      收藏:0      [点我收藏+]

标签:details   double   present   stat   ring   构造函数   mat   article   cal   

 

循环小数输出的坑

  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进行除法运算时的坑

标签:details   double   present   stat   ring   构造函数   mat   article   cal   

原文地址:https://www.cnblogs.com/east7/p/11706738.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!