zoukankan      html  css  js  c++  java
  • 深入理解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



     

  • 相关阅读:
    3月1日起执行!江苏居民阶梯电价有变化!
    个体工商户需要报税吗?
    西红柿的选购方法
    正常人一天该走六千还是一万步?步数滚蛋,运动强度和时长才重要,锻炼身体,快走
    NAT四种类型以及提高NAT类型的途径和方法 nat1 nat2 nat3 nat4
    6种沙坦类药物有什么区别, 选哪一种更好? 药师一次说清楚
    心脏神经官能症是什么症状
    呼吸性碱中毒
    Python Serverless 开源框架:Zappa(详细教程)
    不用代码趣讲 ZooKeeper 集群
  • 原文地址:https://www.cnblogs.com/yz-yang/p/10997593.html
Copyright © 2011-2022 走看看