BigDecimal的一些了解

Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是工程计算,在商业计算中要用java.math.BigDecimal。BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象

 

1 首先是创建BigDecimal对象

 创建BigDecimal对象主要有两种方法

 BigDecimal b1 = new BigDecimal("1.34");//1.34

     BigDecimal b2 = BigDecimal.valueOf(1.34);//1.34

 其实写法上有很多种,例如:

 BigDecimal b1 = new BigDecimal(1.34);这种写法精度会有一点缺失

 BigDecimal b1 = new BigDecimal(Double.toString(1.34))

   这样的写法都是可行的 只是会出现精度上的问题 

   另外,还有一些特别的写法,像 0 ,1, 10这些的写法可以更加简便一些

 BigDecimal zero = BigDecimal.ZERO;
 BigDecimal one = BigDecimal.ONE;
 BigDecimal ten = BigDecimal.TEN;

 

2 BigDecimal的加减乘除运算

 public BigDecimal add(BigDecimal value);//加法

 public BigDecimal subtract(BigDecimal value);//减法

 public BigDecimal multiply(BigDecimal value);//乘法

 public BigDecimal divide(BigDecimal value);//除法

 对于加减乘都是差不多的,对于除法,个人觉得有一些需要注意的

 BigDecimal做除法时,尽量使用divide(BigDecimal divisor, int scale, int roundingMode),这个方法

 divisor:被除数    scale保留小数位数   roundingMode保留小数时采用的方法,一般使用BigDecimal.ROUND_UP(四舍五入)

 如果不指定保留小数位数,在遇到除不尽的情况下就会报错

 对于roundingMode这个参数,我工作上用的是ROUND_UNNECESSARY(

  1. 断言请求的操作具有精确的结果,因此不需要舍入。
  2. 如果对获得精确结果的操作指定此舍入模式,则抛出ArithmeticException

 )

 这个网上都有,这里就不一一介绍了。

 因为我工作中也有用到格式化小数点,所以在这里也记录一下,虽然BigDecimal.divide()方法能格式化

 BigDecimal.setScale();//用于格式化小数点 

 setScale(1);//表示保留以为小数,默认用四舍五入方式 

 setScale(1,BigDecimal.ROUND_DOWN);//直接删除多余的小数位,如2.35会变成2.3 

 setScale(1,BigDecimal.ROUND_UP);//进位处理,2.35变成2.4 

 setScale(1,BigDecimal.ROUND_HALF_UP);//四舍五入,2.35变成2.4

 setScaler(1,BigDecimal.ROUND_HALF_DOWN);//四舍五入,2.35变成2.3,如果是5则向下舍

 用divide()也能格式化小数点,作用和setScale()一样,例:

 new BigDecimal("x").divide(new BigDecimal("y"),2(要保留的小数位), BigDecimal.ROUND_HALF_UP)

 new BigDecimal("x").divide(new BigDecimal("y")).setScale(2(要保留的小数位), BigDecimal.ROUND_HALF_UP)

 这两行代码其实一样的结果,目前我不知道哪里有区别

 以下是BigDecimal除法的源码:

 

try {
    quotient = this.divide(divisor, mc);
} catch (ArithmeticException e) {
    throw new ArithmeticException("Non-terminating decimal expansion; " +
                                  "no exact representable decimal result.");
}

 注意一点:BigDecimal的运算都没有对原值进行操作,而是返回一个新的BigDecimal对象

 

 以上是自己工作中碰到的问题,在这里留下一个总结,也是有摘录网上的一些资料,以免自己忘记不知从何寻找!

 

 

 

   

 

 

 

 

 

 

  

posted @ 2018-09-20 16:18  沉醉街角弥漫的尼古丁  阅读(152)  评论(0编辑  收藏  举报