bigdecimal比较大小 方法
bigdecimal比较大小 方法
BigDecimal: 由任意精度的整数非标度值 和32 位的整数标度 (scale) 组成。如果为零或正数,
则标度是小数点后的位数。如果为负数,则将该数的非标度值乘以 10 的负scale 次幂。因此,BigDecimal
表示的数值是(unscaledValue × 10-scale )。
说明:
则标度是小数点后的位数。如果为负数,则将该数的非标度值乘以 10 的负scale 次幂。因此,BigDecimal
表示的数值是(unscaledValue × 10-scale )。
说明:
BigDecimal(int) 创建一个具有参数所指定整数值的对象。
BigDecimal(double) 创建一个具有参数所指定双精度值的对象。
BigDecimal(long) 创建一个具有参数所指定长整数值的对象。
BigDecimal(String) 创建一个具有参数所指定以字符串表示的数值的对象。
BigDecimal(double) 创建一个具有参数所指定双精度值的对象。
BigDecimal(long) 创建一个具有参数所指定长整数值的对象。
BigDecimal(String) 创建一个具有参数所指定以字符串表示的数值的对象。
可以通过BigDecimal的compareTo方法来进行比较。
返回的结果是int类型,-1表示小于,0是等于,1是大于。
返回的结果是int类型,-1表示小于,0是等于,1是大于。
示例:
BigDecimal num1 = new BigDecimal("0");
BigDecimal num2 = new BigDecimal("1");
BigDecimal num3 = new BigDecimal("2");
BigDecimal num = new BigDecimal("1"); //用做比较的值
System.out.println(num1.compareTo(num)); //小于 时,返回 -1
System.out.println(num2.compareTo(num)); //等于 时,返回 0
System.out.println(num3.compareTo(num)); //大于 时,返回 1
BigDecimal num1 = new BigDecimal("0");
BigDecimal num2 = new BigDecimal("1");
BigDecimal num3 = new BigDecimal("2");
BigDecimal num = new BigDecimal("1"); //用做比较的值
System.out.println(num1.compareTo(num)); //小于 时,返回 -1
System.out.println(num2.compareTo(num)); //等于 时,返回 0
System.out.println(num3.compareTo(num)); //大于 时,返回 1
源码分析
4.1 valueOf(double val) 方法
public static BigDecimalvalueOf(double val) {
// Reminder: a zero double returns '0.0', so we cannotfastpath
// to use the constant ZERO. This might be important enough to
// justify a factory approach, a cache, or a few private
// constants, later.
returnnew BigDecimal(Double.toString (val));//见3.1关于JDK 描述的第三点 }
4.2 add(BigDecimal augend)方法
public BigDecimal add(BigDecimal augend) {
long xs =this . intCompact ; //整型数字表示的BigDecimal, 例a 的intCompact 值为122
long ys = augend.intCompact ; //同上
BigIntegerfst = (this . intCompact !=INFLATED ) ?null :this . intVal ; //初始化BigInteger 的值,intVal 为BigDecimal 的一个BigInteger 类型的属性
BigIntegersnd=(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)//判断有无溢出
return BigDecimal.valueOf (sum,rscale);//返回使用BigDecimal 的静态工厂方法得到的BigDecimal 实例
}
if (fst ==null )
fst =BigInteger.valueOf (xs);//BigInteger的静态工厂方法
if (snd ==null )
snd =BigInteger.valueOf (ys);
BigInteger sum =fst.add(snd);
return (fst.signum == snd.signum ) ?new BigDecimal(sum,INFLATED , rscale, 0) :
new BigDecimal(sum,compactValFor (sum),rscale, 0);//返回通过其他构造方法得到的BigDecimal 对象
}
以上只是对加法源码的分析,减乘除其实最终都返回的是一个新的BigDecimal 对象,因为BigInteger 与BigDecimal 都是不可变的(immutable )的,
在进行每一步运算时,都会产生一个新的对象,所以a.add(b);虽然做了加法操作,但是a 并没有保存加操作后的值,正确的用法应该是a=a.add(b);
原文链接:http://www.jxszl.com/biancheng/JAVA/446438.html