• Java零基础入门-大数


    哈喽,各位小伙伴们,你们好呀,我是喵手。

      今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

      我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

    小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

    前言

    在实际开发中,我们经常需要处理大数运算问题,如高精度计算、密码学算法等。而Java这门语言天生支持大数计算,本文将探讨如何在Java中进行大数的运算。

    摘要

    本文通过解析Java中BigInteger和BigDecimal类的源代码来介绍Java中大数的实现方式,探讨其适用的应用场景以及其优缺点。同时,本文还提供了类代码方法介绍和测试用例,以便读者更好地理解和应用大数计算的方法。

    java之大数

    简介

    Java中提供了两个类来表示大数:BigInteger和BigDecimal。BigInteger类用来表示任意大小的整数,而BigDecimal则用来表示任意精度的十进制数。这两个类都提供了各种算术和运算操作符,可以方便地进行基本数学运算。

    源代码解析

    BigInteger类

    public class BigInteger extends Number implements Comparable<BigInteger> {
        
        // 自然数的位数限制,即Max(Min(R-1, (1L << 32) - 1), 16)
        private static final int MAX_MAG_LENGTH = Integer.MAX_VALUE / Integer.SIZE + 1;
        
        // 存储大数的数组
        final int[] mag;
        
        // 大数的符号,1表示正数,-1表示负数,0表示0
        final int signum;
        
        // 构造函数,根据字符串来构造BigInteger
        public BigInteger(String val) {
            // 省略代码
        }
        
        // 构造函数,根据long类型的值来构造BigInteger
        public BigInteger(long val) {
            // 省略代码
        }
        
        // 实现加法
        public BigInteger add(BigInteger val) {
            // 省略代码
        }
        
        // 实现减法
        public BigInteger subtract(BigInteger val) {
            // 省略代码
        }
        
        // 实现乘法
        public BigInteger multiply(BigInteger val) {
            // 省略代码
        }
        
        // 实现除法
        public BigInteger divide(BigInteger val) {
            // 省略代码
        }
        
        // 实现取余
        public BigInteger remainder(BigInteger val) {
            // 省略代码
        }
        
        // 实现幂运算
        public BigInteger pow(int exponent) {
            // 省略代码
        }
        
        // 实现比较大小
        public int compareTo(BigInteger val) {
            // 省略代码
        }
        
        // 省略其他方法
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58

    从上面的代码可以看出,BigInteger类内部使用一个int数组来存储大数,并且提供了各种算术和运算操作符,可以方便地进行基本数学运算。同时,BigInteger还提供了比较大小、转换为其他数据类型等方法。

    BigDecimal类

    public class BigDecimal extends Number implements Comparable<BigDecimal> {
        
        // 存储数值的int数组
        private final int[] intVal;
        
        // 小数位数
        private final int scale;
        
        // 构造函数,根据字符串来构造BigDecimal
        public BigDecimal(String val) {
            // 省略代码
        }
        
        // 构造函数,根据double类型的值来构造BigDecimal
        public BigDecimal(double val) {
            // 省略代码
        }
        
        // 实现加法
        public BigDecimal add(BigDecimal augend) {
            // 省略代码
        }
        
        // 实现减法
        public BigDecimal subtract(BigDecimal subtrahend) {
            // 省略代码
        }
        
        // 实现乘法
        public BigDecimal multiply(BigDecimal multiplicand) {
            // 省略代码
        }
        
        // 实现除法
        public BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode) {
            // 省略代码
        }
        
        // 实现绝对值
        public BigDecimal abs() {
            // 省略代码
        }
        
        // 实现取反
        public BigDecimal negate() {
            // 省略代码
        }
        
        // 实现比较大小
        public int compareTo(BigDecimal val) {
            // 省略代码
        }
        
        // 省略其他方法
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55

    从上面的代码可以看出,BigDecimal类也提供了各种算术和运算操作符,与BigInteger类的区别在于它能够处理小数位,同时提供了精度控制和舍入模式等选项。

    应用场景案例

    在实际开发中,大数计算可以用于以下场景:

    1. 高精度计算:在计算机科学领域中,有些问题需要使用高精度计算来避免精度误差,如计算圆周率、计算斐波那契数列等。
    2. 密码学算法:密码学算法中需要处理大素数的运算,如RSA算法、DH算法等。
    3. 金融计算:在金融计算中,需要处理较大的金额,如计算股票价格、计算货币汇率等。

    优缺点分析

    优点

    1. 精度高:使用大数计算可以避免精度误差,保证计算结果的准确性。
    2. 方便易用:Java中的BigInteger和BigDecimal类提供了各种算术和运算操作符,使用方便。

    缺点

    1. 内存占用大:由于大数需要使用数组来存储,所以内存占用比较大。
    2. 计算速度慢:由于大数计算需要进行大量的运算,所以计算速度比较慢。

    类代码方法介绍

    BigInteger类方法介绍

    • add:实现加法操作。
    • subtract:实现减法操作。
    • multiply:实现乘法操作。
    • divide:实现除法操作。
    • pow:实现幂运算操作。
    • abs:返回绝对值。
    • negate:取反操作。
    • compareTo:比较大小。

    BigDecimal类方法介绍

    • add:实现加法操作。
    • subtract:实现减法操作。
    • multiply:实现乘法操作。
    • divide:实现除法操作。
    • abs:返回绝对值。
    • negate:取反操作。
    • compareTo:比较大小。
    • setScale:设置小数位数。
    • setScale(RoundingMode):设置舍入模式。

    测试用例

    import java.math.BigDecimal;
    import java.math.BigInteger;
    import org.junit.Assert;
    import org.junit.Test;
    
    public class BigIntegerBigDecimalTest {
    
        @Test
        public void testBigInteger() {
            BigInteger a = new BigInteger("12345678901234567890");
            BigInteger b = new BigInteger("98765432109876543210");
            Assert.assertEquals("111111111111111111100", a.add(b).toString());
            Assert.assertEquals("-86419753086419753020", a.subtract(b).toString());
            Assert.assertEquals("1219326311375893197749136894240803909616745376", a.multiply(b).toString());
            Assert.assertEquals("0", a.remainder(b).toString());
            Assert.assertEquals("155568095557812481051729269851721844057408", a.pow(2).toString());
            Assert.assertEquals(-1, a.compareTo(b));
        }
    
        @Test
        public void testBigDecimal() {
            BigDecimal a = new BigDecimal("1234567890.1234567890");
            BigDecimal b = new BigDecimal("9876543210.9876543210");
            Assert.assertEquals("11111111101.1111111100", a.add(b).toString());
            Assert.assertEquals("-8641975320.8641975320", a.subtract(b).toString());
            Assert.assertEquals("12193263113758931.97749136894240803909616745376", a.multiply(b).toString());
            Assert.assertEquals("0.1250304498", a.divide(b, 10, BigDecimal.ROUND_HALF_UP).toString());
            Assert.assertEquals("1234567890.1234567890", a.divide(BigDecimal.ONE, 10, BigDecimal.ROUND_HALF_UP).toString());
            Assert.assertEquals(-1, a.compareTo(b));
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    以上代码是对BigInteger和BigDecimal类的基本操作进行测试的代码。可以看到,在测试过程中,我们可以方便地使用其提供的各种算术和运算操作符进行计算,并通过断言语句(Assert)来验证计算结果是否正确。

    总结

    本文介绍了Java中大数计算的实现方式和应用场景,探讨了其优缺点,并提供了BigInteger和BigDecimal类的源代码解析、类方法介绍和测试用例,希望能够对读者更好地理解和应用大数计算提供帮助。

    … …

    文末

    好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

    … …

    学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

    wished for you successed !!!


    ⭐️若喜欢我,就请关注我叭。

    ⭐️若对您有用,就请点赞叭。

    ⭐️若有疑问,就请评论留言告诉我叭。

  • 相关阅读:
    jvm-直接内存笔记【详细】
    广西民族大学计算机考研资料汇总
    4.1提出问题&4.2拉格朗日插值
    C++ ACM
    PDF 工具箱
    基于java的校园网络教学网站系统
    JVM内存模型(JMM)
    什么是乐观锁/悲观锁_java培训课程
    使用Oracle SQL Developer管理Oracle Database Express Edition (XE)
    聊聊应用架构的演变
  • 原文地址:https://blog.csdn.net/weixin_66592566/article/details/134202115