Java零基础入门-大数

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

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

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

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

前言

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

摘要

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

java之大数

简介

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

源代码解析

BigInteger类

java 复制代码
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) {
        // 省略代码
    }
    
    // 省略其他方法
}

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

BigDecimal类

java 复制代码
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) {
        // 省略代码
    }
    
    // 省略其他方法
}

从上面的代码可以看出,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):设置舍入模式。

测试用例

java 复制代码
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));
    }
}

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

总结

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

... ...

文末

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

... ...

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

wished for you successed !!!


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

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

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

相关推荐
煤泥做不到的!1 小时前
挑战一个月基本掌握C++(第十一天)进阶文件,异常处理,动态内存
开发语言·c++
F-2H1 小时前
C语言:指针4(常量指针和指针常量及动态内存分配)
java·linux·c语言·开发语言·前端·c++
苹果酱05671 小时前
「Mysql优化大师一」mysql服务性能剖析工具
java·vue.js·spring boot·mysql·课程设计
_oP_i2 小时前
Pinpoint 是一个开源的分布式追踪系统
java·分布式·开源
mmsx2 小时前
android sqlite 数据库简单封装示例(java)
android·java·数据库
bryant_meng2 小时前
【python】OpenCV—Image Moments
开发语言·python·opencv·moments·图片矩
武子康3 小时前
大数据-258 离线数仓 - Griffin架构 配置安装 Livy 架构设计 解压配置 Hadoop Hive
java·大数据·数据仓库·hive·hadoop·架构
若亦_Royi3 小时前
C++ 的大括号的用法合集
开发语言·c++
资源补给站4 小时前
大恒相机开发(2)—Python软触发调用采集图像
开发语言·python·数码相机
豪宇刘4 小时前
MyBatis的面试题以及详细解答二
java·servlet·tomcat