专栏首页分享学习BIgDecimal()和BigInteger()运算add(),sub(),div(),muti()加减乘除其实都是有返回值的

BIgDecimal()和BigInteger()运算add(),sub(),div(),muti()加减乘除其实都是有返回值的

BigDecimal的加法源码如下,都是有返回值的。 因为BigInteger与BigDecimal都是不可变的(immutable)的,在进行每一步运算时,都会产生一个新的对象,所以 a.add(b)虽然做了加法操作,但是a并没有保存加操作后的值,正确的用法应该是a=a.add(b); 减乘除操作也是一样的返回一个新的BigDecimal对象。

public BigDecimal add(BigDecimal augend) {
    long xs =this.intCompact; //整型数字表示的BigDecimal,例a的intCompact值为122
    long ys = augend.intCompact;//同上
    //初始化BigInteger的值,intVal为BigDecimal的一个BigInteger类型的属性
    BigInteger fst = (this.intCompact !=INFLATED) ?null :this.intVal;
    BigInteger snd =(augend.intCompact !=INFLATED) ?null : augend.intVal;
    int rscale =this.scale;//小数位数
    long sdiff = (long)rscale - augend.scale;//小数位数之差
    if (sdiff != 0) {//取小数位数多的为结果的小数位数
     if (sdiff < 0) {
         int raise =checkScale(-sdiff);
         rscale =augend.scale;
         if (xs ==INFLATED ||(xs = longMultiplyPowerTen(xs,raise)) ==INFLATED)
           fst =bigMultiplyPowerTen(raise);
         }else {
           int raise =augend.checkScale(sdiff);
           if (ys ==INFLATED ||(ys =longMultiplyPowerTen(ys,raise)) ==INFLATED)
             snd = augend.bigMultiplyPowerTen(raise);
         }
      }
    if (xs !=INFLATED && ys !=INFLATED) {
       long sum = xs + ys;
       if ( (((sum ^ xs) &(sum ^ ys))) >= 0L)//判断有无溢出
         //返回使用BigDecimal的静态工厂方法得到的BigDecimal实例
         return BigDecimal.valueOf(sum,rscale);
    }
    if (fst ==null)
        fst =BigInteger.valueOf(xs);//BigInteger的静态工厂方法
    if (snd ==null)
        snd =BigInteger.valueOf(ys);
    BigInteger sum =fst.add(snd);
    //返回通过其他构造方法得到的BigDecimal对象
    return (fst.signum == snd.signum) ?new BigDecimal(sum,INFLATED, rscale, 0) :
      new BigDecimal(sum,compactValFor(sum),rscale, 0);
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【刨根问底】BigDecimal 案例和部分源码分析

    在咱们开发过程中很容易遇到计算的问题,普通计算其实也还好使用int、long、double、float基本上能应付。但是如果涉及到数据类型转后在处理等就不是很好...

    田维常
  • java学习之路:24.大数字运算(BigInteger,BigDecimal)

    BigInteger类型的数字要比Integer类型的数字范围大得多,并且支持任意精度的整数,在运算中,BigInteger类型可以准确地表示任何大小的整数值而...

    花狗Fdog
  • 第三阶段-Java常见对象:【第十章 BigInteger和BigDecimal类】

    将double转换为BigDecimal ,这是double的二进制浮点值的精确十进制表示。

    BWH_Steven
  • Java中的BigDecimal类你了解多少?

    可以看到在Java中进行浮点数运算的时候,会出现丢失精度的问题。那么我们如果在进行商品价格计算的时候,就会出现问题。很有可能造成我们手中有0.06元,却无法购买...

    用户1516716
  • Java精度问题

    Java中的简单浮点数类型float和double不能够进行运算。 这个问题相当严重,如果你有9.999999999999元,你的计算机是不会认为你可以购买10...

    用户1205080
  • Java使用最小二乘法实现线性回归预测

    通常可以得到一系列成对的数据(x1, y1),(x2, y2)… (xm , ym)

    你好戴先生
  • 高精度运算

    在写Java代码时候,我们其实很少去考虑高精度运算,即使遇到无法避免高精度的计算问题也不会太烦恼,因为有大整数类BigInteger以及BigDecimal工具...

    每天学Java
  • BigDecimal和BigInteger

    我们知道计算机都是以二进制的形式存储数据的,而我们日常则是使用十进制,那么我们的 数字 存进计算机则需一个进制转换的过程,这过程就会损失精度的,就导致浮点数不能...

    晚上没宵夜
  • 【小家java】Java数值运算 [加减乘除] 精度丢失原因分析,提供保证精度的MathHelper工具类

    有没有一种触目惊心的感觉,感觉回去检查检查自己的代码,有没有一些数值运算吧,哈哈。这个问题相当严重,比如你有9.999999999999元,你的计算机是不会认为...

    YourBatman
  • Java开发中商业计算请务必使用BigDecimal来进行计算!

    今天群里一个初级开发者问为什么测试人员测出来他写的价格计算模块有计算偏差的问题,他检查了半天也没找出问题。这里小胖哥要提醒你,商业计算请务必使用`BigDeci...

    码农小胖哥
  • [十七]基础类型BigDecimal简介

    BigDecimal表示的数为: unscaledValue × 10的-scale 次幂

    noteless
  • 14(02)正则表达式,Pattern,Mactcher,Math,BigInteger,BigDeximal,System等

    5:BigInteger(理解) (1)针对大整数的运算 (2)构造方法 A:BigInteger(String s) package cn.itcas...

    Java帮帮
  • Java之BigDecimal的高级使用

    使用Java开发的朋友,对于数据相关的计算想必都有过头疼的经历。float和double类型的主要设计目标是为了科学计算和工程计算。他们执行二进制浮点运算,这是...

    23号杂货铺
  • 【答疑解惑】Java中的高精度数字

    前几天网友在群里有问BigDecimal能直接赋值吗?就像使用基本数据类型那样,答案是不能。 Java中的基本数据类型有的时候是不能满足实际编程需要的,特别是在...

    程序员互动联盟
  • Java工具集-数学(精准小数运算BigDecimalUtils)

    cwl_java
  • java保留两位小数

    四舍五入   double   f   =   111231.5585;   BigDecimal   b   =   new   BigDecimal(f...

    bear_fish
  • Java工具类之浮点精确计算

    二十三年蝉
  • Kotlin BigDecimal 精确计算

    码脑
  • Java中的数学运算BigDecimal

    麦洛

扫码关注云+社区

领取腾讯云代金券