哈喽,各位小伙伴们,你们好呀,我是喵手。
今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。
我是一名后端开发爱好者,工作日常接触到最多的就是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类的区别在于它能够处理小数位,同时提供了精度控制和舍入模式等选项。
应用场景案例
在实际开发中,大数计算可以用于以下场景:
- 高精度计算:在计算机科学领域中,有些问题需要使用高精度计算来避免精度误差,如计算圆周率、计算斐波那契数列等。
- 密码学算法:密码学算法中需要处理大素数的运算,如RSA算法、DH算法等。
- 金融计算:在金融计算中,需要处理较大的金额,如计算股票价格、计算货币汇率等。
优缺点分析
优点
- 精度高:使用大数计算可以避免精度误差,保证计算结果的准确性。
- 方便易用:Java中的BigInteger和BigDecimal类提供了各种算术和运算操作符,使用方便。
缺点
- 内存占用大:由于大数需要使用数组来存储,所以内存占用比较大。
- 计算速度慢:由于大数计算需要进行大量的运算,所以计算速度比较慢。
类代码方法介绍
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 !!!
⭐️若喜欢我,就请关注我叭。
⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。