BigDecimal的常用方法及源码解析

本文介绍了BigDecimal在Java中的应用,主要用于高精度计算,避免浮点数的精度问题。文章通过实例展示了BigDecimal的加、减、乘、除操作,并详细解释了compareTo方法的使用及源码分析,帮助理解其比较原理。最后强调了BigDecimal运算时需使用特定方法而非常规算术运算符。
摘要由CSDN通过智能技术生成

一、BigDecimal的简要概括

在我们的日常计算中,有时会涉及到比较大的数字之间的计算(如:超大金额的计算,银行汇款金额,利率、利息之间的换算等,都需要很精确的计算),这时,使用float、double这样的浮点数就不那么准确了。BigDecimal一般用来计算比较精度较高的数值,在很多大厂很受开发人员的青睐。下面我们简单的了解BigDecimal一些常用的方法。

二、BigDecimal的加、减、乘、除。

1.代码:

代码如下(示例):

import numpy as np

BigDecimal decimal = new BigDecimal("4.00");
        System.out.println("相加:"+decimal.add(new BigDecimal("3.00")));
        System.out.println("相减:"+decimal.subtract(new BigDecimal("1.00")));
        System.out.println("相除:"+decimal.divide(new BigDecimal("2.00")));
        System.out.println("相乘:"+decimal.multiply(new BigDecimal("7.00")));

2.运行结果:

相加:7.00
相减:3.00
相除:2
相乘:28.0000


二、compareTo()的使用。

1.代码:

BigDecimal d1 = new BigDecimal("4.00");
BigDecimal d2 = new BigDecimal("2.00");
BigDecimal d3 = new BigDecimal("4.00");
System.out.println("compareTo的比较:"+d1.compareTo(d2));
System.out.println("compareTo的比较:"+d2.compareTo(d1));
System.out.println("compareTo的比较:"+d1.compareTo(d3));

2.运行结果:

compareTo的比较:1
compareTo的比较:-1
compareTo的比较:0

3.compareTo方法源码解析:

public int compareTo(BigDecimal val) {
    // Quick path for equal scale and non-inflated case.
    if (scale == val.scale) {
        long xs = intCompact;
        long ys = val.intCompact;
        if (xs != INFLATED && ys != INFLATED)
            return xs != ys ? ((xs > ys) ? 1 : -1) : 0;
    }
    int xsign = this.signum();
    int ysign = val.signum();
    if (xsign != ysign)
        return (xsign > ysign) ? 1 : -1;
    if (xsign == 0)
        return 0;
    int cmp = compareMagnitude(val);
    return (xsign > 0) ? cmp : -cmp;
}

我们来简单的了解一下源码。
首先判断两个比较值的scale(标度)值是否相等,相等时进入if方法体,定义两个比较值的膨胀值(非负数),之后进入if判断语句,判断改膨胀值不等于最小long型取值范围,如果都满足条件则进入if的方法体,里面是两个嵌套的三目运算方程式。xs != ys ? ((xs > ys) ? 1 : -1) : 0;
1.如果xs不等于ys时为true,执行((xs > ys) ? 1 : -1)
接着,判断xs是否大于ys如果是则返回结果为1,否则为-1
2.如果xs等于ys时为false,返回结果为0。
两个比较值的scale(标度)值是不相等时,往下执行代码,首先定义两个精度值,方法方法里面

public int signum() {
    return (intCompact != INFLATED)?
        Long.signum(intCompact):
        intVal.signum();
}

首先是个三目运算判断膨胀值不等于最小long取值范围。若为true时则,执行
Long.signum(intCompact)方程式

public static int signum(long i) {
    // HD, Section 2-7
    return (int) ((i >> 63) | (-i >>> 63));
}

若为true时,则返回当前膨胀值。
接着继续对两值进行判断大小。
接下来的这个compareMagnitude(val)方法也是对两个比较值做其他规则的精度处理后判断大小,感兴趣的朋友可以去看源码。

总结

BigDecimal加、减、乘、除不能用通常的+、-、*、/。只能改方法封装的add()、subtract()、 divide() 、 multiply()的发方法执行运算。
compareTo() 的方法 x>y,返回 1,x=y,返回 0 ,x<y 返回 -1。
以上就是我今天的学习内容,有不对的请大佬们指点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值