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 !!!


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

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

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

相关推荐
考虑考虑20 分钟前
Jpa使用union all
java·spring boot·后端
用户37215742613542 分钟前
Java 实现 Excel 与 TXT 文本高效互转
java
浮游本尊2 小时前
Java学习第22天 - 云原生与容器化
java
渣哥4 小时前
原来 Java 里线程安全集合有这么多种
java
间彧4 小时前
Spring Boot集成Spring Security完整指南
java
间彧4 小时前
Spring Secutiy基本原理及工作流程
java
Java水解5 小时前
JAVA经典面试题附答案(持续更新版)
java·后端·面试
洛小豆7 小时前
在Java中,Integer.parseInt和Integer.valueOf有什么区别
java·后端·面试
前端小张同学8 小时前
服务器上如何搭建jenkins 服务CI/CD😎😎
java·后端
ytadpole8 小时前
Spring Cloud Gateway:一次不规范 URL 引发的路由转发404问题排查
java·后端