常用类 (三) ----- BigDecimal和BigInteger大数类

相关文章

  1. 《常用类 (一) ----- Arrays数组工具类》
  2. 《常用类 (二) ----- Math类》
  3. 《常用类 (三) ----- BigDecimal和BigInteger大数类》
  4. 《常用类 (四) ----- Random随机数类》
  5. 《常用类 (五) ----- Date日期类和Calender日历类》
  6. 《常用类 (六) ----- String类与字符串》
  7. 《常用类 (七) ----- 包装类》




一、摘要

java中的基本数据类型能存储的最大的二进制数是 2 ^ 63 - 1,对应的十进制数是9223372036854775807,也就是说只要运算过程中会超过这个数,就会造成数据溢出,从而造成错误.而java.math.*包中提供了大数类,其理论上可以存储无限位的大数,只要内存足够的话。

  1. 大数类又分为整数和浮点数.即BigInteger和BigDecimal
  2. 大数类的对象不能直接进行运算,需要调用类中相应的方法,并且方法的参数必须和调用的类相同,BigInteger不能调用BigDecimal, 不能作为其方法参数, 即整数和浮点数不能混合运算.
二、常用的构造方法

BigInteger

构造方法说明
BigInteger(byte[] b)用字节数组实例化
BigInteger(String s)用字符串实例化

BigDecimal

构造方法说明
BigDecimal(char[] c)用字符数组实例化
BigDecimal(String s)用字符串实例化
三、常用方法
返回值方法名及形参功能
大数类型static valueOf( long/double )用long/double类型赋值给大数类型
大数类型add( 大数类型 )
大数类型subtract( 大数类型 )
大数类型multiply( 大数类型 )
大数类型divide( 大数类型 )
大数类型pow( int n )幂运算
大数类型mod(大数类型)取余
大数类型gcd(大数类型)求最大公约数
大数类型max/min(大数类型)求最值
-1,0,1compareTo( 大数类型 )比较大小
四、测试
    public static void main(String[] args) {
        BigInteger a, b;
        BigDecimal c, d;

        BigInteger m;
        BigDecimal n;

        // 用valueOf给大数类型赋值
        a = BigInteger.valueOf(12345678910L);
        b = BigInteger.valueOf(10987654321L);
        c = BigDecimal.valueOf(12345.678910);
        d = BigDecimal.valueOf(109876.54321);

        // 加 add
        initValue(a, b, c, d);
        m = a.add(b);
        n = c.add(d);
        System.out.println("加法结果:\n" + m + "\n" + n);

        // 减 subtract
        initValue(a, b, c, d);
        m = a.subtract(b);
        n = c.subtract(d);
        System.out.println("减法结果:\n" + m + "\n" + n);

        // 乘 multiply
        initValue(a, b, c, d);
        m = a.multiply(b);
        n = c.multiply(d);
        System.out.println("乘法结果:\n" + m + "\n" + n);

        // 除 divide
        initValue(a, b, c, d);
        m = a.divide(b);
        n = c.divide(d, 100, RoundingMode.HALF_UP);
        System.out.println("除法结果:\n" + m + "\n" + n);

        // 幂运算
        initValue(a, b, c, d);
        m = a.pow(100);
        n = c.pow(100);
        System.out.println("幂运算结果:\n" + m + "\n" + n);

        // 取余 mod
        initValue(a, b, c, d);
        m = a.mod(b);
        System.out.println("取余结果:\n" + m);

        // 最大公因数 gcd
        initValue(a, b, c, d);
        m = a.gcd(b);
        System.out.println("最大公约数结果:\n" + m);

        // 最值 max
        initValue(a, b, c, d);
        m = a.max(b);
        n = c.max(d);
        System.out.println("求最值结果:\n" + m + "\n" + n);

        // 比较大小 compareTo
        initValue(a, b, c, d);
        int result1 = a.compareTo(b);
        int result2 = c.compareTo(d);


    }

    private static void initValue(BigInteger a, BigInteger b, BigDecimal c, BigDecimal d) {
        a = BigInteger.valueOf(12345678910L);
        b = BigInteger.valueOf(10987654321L);
        c = BigDecimal.valueOf(12345.678910);
        d = BigDecimal.valueOf(109876.54321);
    }

输出结果:

加法结果:
23333333231
122222.22212
减法结果:
1358024589
-97530.86430
乘法结果:
135650052221140070110
1356500522.2114007011
除法结果:
1
0.1123595496302108319667076282786890925524958549521882069045481031383094965133277421387490699526530909
幂运算结果:
14174173749143624867199388782976370696584598905623269233794905465646075736639363447485386999471083827856071215306792314850239157595445375554053121819626520989217777709746256424480921947327175482198714220258970951704496456554752431243887669182189882055034074852101536447387155979978224694792011542700957944706132863593588259846889044825464499985801594647890491425519189698057060140974706761606685501525428429105848344710793461513638685209871285158787924000699794775244283827677590792189058992967208305067790184530740009535853295239129970970153362090124167790426513536088580553023216199576498421192897633134220267560149599135706944364789976712679709057162136698835039484941101400189574308641460966764091221067090045342422202344822976773003356908149079355915959748838189606705194837617902681589663790654669167338960468794852887873720676274071749353578286175245427317435492142594903076621828436193110243792222340010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
14174173749143624867199388782976370696584598905623269233794905465646075736639363447485386999471083827856071215306792314850239157595445375554053121819626520989217777709746256424480921947327175482198714220258970951704496456554752431243887669182189882055034074852101536447387155979978224694792011542700957944706132863593588259846889044825464499985801594647890491425519189698057060140974706761606685501525428429105.84834471079346151363868520987128515878792400069979477524428382767759079218905899296720830506779018453074000953585329523912997097015336209012416779042651353608858055302321619957649842119289763313422026756014959913570694436478997671267970905716213669883503948494110140018957430864146096676409122106709004534242220234482297677300335690814907935591595974883818960670519483761790268158966379065466916733896046879485288787372067627407174935357828617524542731743549214259490307662182843619311024379222234001
取余结果:
1358024589
最大公约数结果:
1
求最值结果:
12345678910
109876.54321

Process finished with exit code 0

五、关于BigDecimal小数精度
  1. BigDeciaml在进行加减乘除等运算时可以设置运算结果的小数位数和小数舍入模式,下面以除法为栗子。

    BigDeciaml divide(BigDecimal divisor, int scale, RoundingMode roundingMode)

    (1) scale参数:设置小数位数
    (2) roundingMode参数:设置小数舍入模式

  2. java.math.RoundingMode类中的舍入字段

    字段说明举例
    CEILING向正无穷方向舍入 1.55 ≈ 1.6 1.55\approx1.6 1.551.6,  − 1.55 ≈ 1.5 -1.55 \approx1.5 1.551.5
    FLOOR向负无穷方向舍入 1.55 ≈ 1.5 1.55 \approx 1.5 1.551.5,  − 1.55 ≈ − 1.6 -1.55 \approx-1.6 1.551.6
    DOWN向接近0方向舍入 1.55 ≈ 1.5 1.55 \approx 1.5 1.551.5,  − 1.55 ≈ − 1.5 -1.55 \approx -1.5 1.551.5
    UP向远离0方向舍入 1.55 ≈ 1.6 1.55 \approx1.6 1.551.6,  − 1.55 ≈ − 1.6 -1.55 \approx-1.6 1.551.6
    HALF_UP四舍五入\
    HALF_DOWN五舍六入\
    HALF_EVEN如果舍入前一位的数字为偶数,则采用五舍六入奇数则采用四舍五入 1.45 ≈ 1.4 1.45\approx1.4 1.451.4 1.55 ≈ 1.6 1.55\approx1.6 1.551.6
    UNNECESSARY运算结果有精确位数,不需要舍入\
  3. 测试

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值