深入理解BigDecimal

1、BigDecimal简介

    BigDecimal 由任意精度的整数非标度值 和32 位的整数标度 (scale) 组成。如果为零或正数,则标度是小数点后的位数。如果为负数,则将该数的非标度值乘以 10 的负scale 次幂。因此,BigDecimal表示的数值是(unscaledValue × 10-scale)。

2、API

   (1)构造器

  BigDecimal(int)       创建一个具有参数所指定整数值的对象。      
  BigDecimal(double)    创建一个具有参数所指定双精度值的对象,如果该double转化为二进制会丢精度,该方法可能丢失精度。
  BigDecimal(long)      创建一个具有参数所指定长整数值的对象。     
  BigDecimal(String)    创建一个具有参数所指定以字符串表示的数值的对象,推荐使用。
(2)方法

    add(BigDecimal) BigDecimal对象中的值相加,然后返回这个对象。
    subtract(BigDecimal) BigDecimal对象中的值相减,然后返回这个对象。
    multiply(BigDecimal) BigDecimal对象中的值相乘,然后返回这个对象。
    divide(BigDecimal) BigDecimal对象中的值相除,然后返回这个对象。
    toString() 将BigDecimal对象的数值转换成字符串。
    doubleValue() 将BigDecimal对象中的值以双精度数返回。
    floatValue() 将BigDecimal对象中的值以单精度数返回。
    longValue() 将BigDecimal对象中的值以长整数返回。
    intValue() 将BigDecimal对象中的值以整数返回。

3、源码解读

   (1)属性

    intVal 表示BigDecimal未缩放值

    scale  比例-整数标度(如果为零或正数,则标度是小数点后的位数。如果为负数,则将该数的非标度值乘以 10 的负scale 次幂)

    precision 这个BigDecimal中的小数位数,如果是,则为0数字的数目是未知的(后备信息)。如果非零,值是保证正确的。(不是很理解)

    stringCache 存对应的字符串

    intCompact 如果这个BigDecimal的有效值和绝对值是小于或等于{@code Long.MAX_VALUE},值可以是紧凑地存储在这个字段中并用于计算。

   (2)add

public BigDecimal add(BigDecimal augend) {

     //1、intCompact都不等于与Long.MAX_VALUE,传this.intCompact,否则传intVal
     if (this.intCompact != INFLATED) {
         if ((augend.intCompact != INFLATED)) {
             return add(this.intCompact, this.scale, augend.intCompact, augend.scale);
        } else {
            return add(this.intCompact, this.scale, augend.intVal, augend.scale);
       }
    } else {
       if ((augend.intCompact != INFLATED)) {
            return add(augend.intCompact, augend.scale, this.intVal, this.scale);
       } else {
            return add(this.intVal, this.scale, augend.intVal, augend.scale);
       }
   }
}

https://www.jianshu.com/p/c81edc59546c

https://blog.csdn.net/jackiehff/article/details/8582449



 

原文地址:https://www.cnblogs.com/yz-yang/p/10997593.html