当前位置: 首页 > news >正文

【从零开始学Java | 第十八篇】BigInteger

目录

前言

一、什么是BigInteger?

1.BigInteger构造方法

2.构造方法总结

二、BigInteger常见成员方法

1.加减乘除

2.divideAndRemainder

3.equals

总结


前言

之前我们学习基本数据类型时,知道int最大值大约是 21 亿,而long的最大值大约是 900 亿亿。 听起来很大对吧?但是,如果我们要求 100 的阶乘(100!),或者处理加密算法中动辄几百位的超大数字,long也会瞬间内存溢出

当基本数据类型无法满足我们的需求时,Java为我们提供了一个工具类——BigInteger

一、什么是BigInteger?

BigInteger位于java.math包下。

与int和long这些受限于计算机硬件位数的基本数据类型不同,BigInteger是一个引用数据类型(对象)

它在底层实际上是通过动态数组来存储数字的。只要你的电脑内存足够大,它就能存下无限长的数字。

1.BigInteger构造方法

方法名说明
publicBigInteger(int num, Random rnd)获取随机大整数,范围:[0 ~ 2的num次方-1]
publicBigInteger(String val)获取指定的大整数
publicBigInteger(String val, int radix)获取指定进制的大整数
public staticBigInteger valueOf(long val)静态方法获取BigInteger的对象,内部有优化

注:BigInteger对象一旦创建,内部记录的值不能发生改变

BigInteger(int num, Random rnd):获取随机大整数,范围:[0 ~ 2的num次方-1]

public class Test { public static void main(String[] args) { for (int i = 0; i < 10; i++) { BigInteger bd1 = new BigInteger(4, new Random()); System.out.println(bd1); } } }

运行结果:

BigInteger(String val):获取指定的大整数

public class Test { public static void main(String[] args) { BigInteger bd2 = new BigInteger("999999999999999999999"); System.out.println(bd2); } }

运行结果:

错误范例

当输入小数时:

注:字符串中必须是整数,否则会报错

BigInteger(String val, int radix):获取指定进制的大整数

public class Test { public static void main(String[] args) { BigInteger bd4 = new BigInteger("100", 10); BigInteger bd5 = new BigInteger("100", 2); System.out.println(bd4); System.out.println(bd5); } }

运行结果:

注:

1、字符串中的数字必须是整数。

2、字符串中的数字必须要跟进制吻合。

BigInteger valueOf(long val):静态方法获取BigInteger的对象,内部有优化

基础用法:

public class Test { public static void main(String[] args) { BigInteger bd1 = BigInteger.valueOf(100); System.out.println(bd1); } }

细节1:该方法表示的范围比较小,只能在long的取值范围内,如果超出了long的范围就会报错。

public class Test { public static void main(String[] args) { System.out.println(Long.MAX_VALUE); BigInteger bd1 = BigInteger.valueOf(9223372036854775807L); System.out.println(bd1); } }

但是

细节2:该方法对常用的数字进行了优化,-16 ~ +16,提前把-16 ~ +16创建好BigInteger的对象,如果多次获取不会创建新的。

public class Test { public static void main(String[] args) { BigInteger bd1 = BigInteger.valueOf(16); BigInteger bd2 = BigInteger.valueOf(16); BigInteger bd3 = BigInteger.valueOf(17); BigInteger bd4 = BigInteger.valueOf(17); System.out.println(bd1 == bd2); System.out.println(bd3 == bd4); } }

运行结果:

2.构造方法总结

  1. 如果BigInteger表示的数字没有超出long的范围,可以使用静态方法获取。
  2. 如果BigInteger表示的超出long的范围,可以用构造方法获取。
  3. 对象一旦创建,BigInteger内部记录的值不能发生改变
  4. 只要进行计算都会产生一个新的BigInteger对象。

二、BigInteger常见成员方法

方法名说明
public BigIntegeradd(BigInteger val)加法
public BigIntegersubtract(BigInteger val)减法
public BigIntegermultiply(BigInteger val)乘法
public BigIntegerdivide(BigInteger val)除法,获取商
public BigInteger[]divideAndRemainder(BigInteger val)除法,获取商和余数
public booleanequals(object x)比较是否相同
public BigIntegerpow(int exponent)次幂
public BigIntegermax/min(BigInteger val)返回较大值/较小值
public intintValue(BigInteger val)转为int类型整数

1.加减乘除

public class MathDemo { public static void main(String[] args) { BigInteger a = new BigInteger("10000000000000000000"); BigInteger b = new BigInteger("20000000000000000000"); // 加法 (Add) BigInteger sum = a.add(b); System.out.println("加法结果:" + sum); // 减法 (Subtract) BigInteger sub = a.subtract(b); // 乘法 (Multiply) BigInteger mul = a.multiply(b); // 除法 (Divide) - 注意:如果是除不尽的,它会像 int 一样直接舍弃小数部分 BigInteger div = b.divide(a); } }

2.divideAndRemainder

public class Test { public static void main(String[] args) { BigInteger a = new BigInteger("10000000000000000002"); BigInteger b = new BigInteger("20000000000000000000"); BigInteger[] c = b.divideAndRemainder(a); for (int i = 0; i < 2; i++) { System.out.println(c[i]); } } }

运行结果:

3.equals

public class Test { public static void main(String[] args) { BigInteger a = new BigInteger("10000000000000000002"); BigInteger b = new BigInteger("20000000000000000000"); boolean result = a.equals(b); System.out.println(result); } }

运行结果:

总结

  • 遇到超大数字,优先使用new BigInteger("字符串")

  • 使用addsubtractmultiplydivide

  • 计算结果必须重新赋值,因为它不可变

http://www.jsqmd.com/news/529604/

相关文章:

  • C30混凝土实体群桩与边坡稳定性的数值计算模拟及监测研究
  • SUNFLOWER MATCH LAB 科研工具链:Matlab数据预处理与模型调用接口
  • 基于Luminex技术的药效评估方法研究与应用
  • fastMRI技术竞赛实战指南:从数据挑战到算法突破的完整路径
  • 手把手教你为CST8XX触摸屏编写设备树(DTS):基于Hynitron芯片的完整配置指南
  • NSudo:Windows系统权限管理的终极解决方案与完全指南
  • Dify平台上的ViT模型应用:无需编码构建图像分类服务
  • GTE文本向量模型效果展示:多语言文本相似度计算案例
  • Arrow:高效可视化游戏叙事设计工具,让复杂剧情创作变得简单
  • 如何用猫抓插件下载网页视频和音频?浏览器资源嗅探工具完整指南
  • 基于MATLAB的DTW算法在特定人孤立词语音识别系统中的应用——16页试验文档
  • 从Full-band到Sub-band:自适应滤波器演进史与SAF在WebRTC等现代语音引擎中的角色
  • 通义千问1.5-1.8B-Chat-GPTQ-Int4 Python入门实战:零基础快速部署与对话测试
  • From Neurons to Logic Gates: Decoding the McCulloch-Pitts Neural Network Model
  • FileZilla FTP服务器搭建全攻略:从安装到被动模式配置(附防火墙设置技巧)
  • QMCDecode:打破QQ音乐格式枷锁,终极音频自由转换指南
  • 2026燃气热水器服务新篇章:专业守护,温暖每一刻 - 深度智识库
  • PC端聊天软件消息防撤回解决方案:从技术原理到企业级应用
  • Logitech MX Master 4:办公鼠标的新标杆?
  • Scrcpy无线投屏终极指南:从USB到WiFi的完整配置流程(含多设备切换技巧)
  • Python轻量级GUI开发利器:DearPyGui入门指南
  • 如何快速解密NCM音乐格式:面向新手的完整ncmdump使用指南
  • Android车载摄像头开发避坑指南:从手机Camera2到车载EVS,我踩过的那些‘坑’
  • 实战:基于STM32F4与ILI9488的LVGUI底层驱动适配与性能调优
  • Horos:开源医疗影像查看器,为医学诊断与研究提供专业级解决方案
  • RTKLIB新手必看:RTKCONV格式转换工具从安装到实战(附RINEX配置技巧)
  • 【若依框架】—— 定制代码生成器:集成Lombok、Mybatis-Plus与Swagger的实战指南
  • Matlab 实现基于 IMM 和 UKF/EKF 的三维路径跟踪预测仿真
  • 5个突破性特性彻底改变终端工作流
  • HY-Motion 1.0真实案例分享:高质量骨骼动画生成全流程