java.math.BigInteger类的使用

在Java中,基本数据类型long能表示的最大整数范围是64位,对于超出这个范围的整数计算,就需要借助java.math.BigInteger类。这个类可以表示任意大小的整数,完全摆脱了原生数据类型的范围限制。

BigInteger的特性

BigInteger最显著的特点是支持任意精度的整数运算。它内部通过一个int[]数组来存储大整数的各位数字,从而实现对超大整数的表示和计算。

创建BigInteger实例的方式很简单,通常通过字符串构造:

BigInteger big = new BigInteger("123456789012345678901234567890");

与基本类型的运算不同,BigInteger的所有运算都通过实例方法完成:

BigInteger a = new BigInteger("987654321");
BigInteger b = new BigInteger("123456789"); BigInteger sum = a.add(b); // 加法
BigInteger difference = a.subtract(b); // 减法
BigInteger product = a.multiply(b); // 乘法
BigInteger quotient = a.divide(b); // 除法
BigInteger remainder = a.remainder(b); // 取余

注:除法运算时如果不能整除,会抛出ArithmeticException,可以使用divideAndRemainder()方法同时获取商和余数

与基本类型的转换

BigInteger继承自Number类,因此可以通过以下方法转换为基本数据类型:

  • byteValue():转换为byte
  • shortValue():转换为short
  • intValue():转换为int
  • longValue():转换为long
  • floatValue():转换为float
  • doubleValue():转换为double

需要注意的是,如果BigInteger表示的数值超出了目标基本类型的范围,转换会丢失高位信息,导致结果不准确(使用floatValue()doubleValue()转换超大数值时,可能会得到Infinity)。为了确保转换的安全性,可以使用带Exact后缀的方法:

BigInteger large = new BigInteger("1000000000000");
try {
long val = large.longValueExact(); // 准确转换
int intVal = large.intValueExact(); // 会抛出异常,因为超出int范围
} catch (ArithmeticException e) {
System.out.println("转换超出范围:" + e.getMessage());
}

longValueExact()等方法在转换超出范围时会抛出ArithmeticException,避免了静默的数据丢失。

优缺点分析

优点

  • 突破基本类型的范围限制,支持任意大小的整数
  • 提供了丰富的数学运算方法,包括幂运算、模运算等
  • 是不可变类,线程安全

缺点

  • 运算速度比原生类型慢,因为是软件模拟的运算
  • 内存占用较大,需要存储额外的数组结构
  • 不能使用+-等运算符,必须调用方法

Java核心类——7.BigInteger的更多相关文章

  1. 从字节码和JVM的角度解析Java核心类String的不可变特性

    1. 前言 最近看到几个有趣的关于Java核心类String的问题. String类是如何实现其不可变的特性的,设计成不可变的好处在哪里. 为什么不推荐使用+号的方式去形成新的字符串,推荐使用Stri ...

  2. Java核心类

    Java核心类的学习: 常用类库 io流 集合 多线程 网络编程 调试与优化 XML和JSON 枚举.注解和反射 设计模式

  3. Day1 面向对象编程与Java核心类

    this变量 在方法内部,可以使用一个隐含的变量this,它始终指向当前实例.如果没有命名冲突,可以省略this. 但是,如果有局部变量和字段重名,那么局部变量优先级更高,就必须加上this. 构造方 ...

  4. 【Java常用类】BigInteger

    BigInteger Integer类作为int的包装类,能存储的最大整型值为2^31-1,Long类也是有限的, 最大为2 ^63-1.如果要表示再大的整数,不管是基本数据类型还是他们的包装类 都无 ...

  5. Java基础学习笔记二十三 Java核心语法之反射

    类加载器 类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,链接,初始化三步来实现对这个类进行初始化. 加载就是指将class文件读入内存,并为之创建一个Class对象.任 ...

  6. Java——String类中的compareTo方法总结

    String类的定义:    java.lang  类 String   java.lang.Object      java.lang.String 所有已实现的接口:Serializable, C ...

  7. Java常用类(二) Scanner类和大数类

    二.Scanner类 有C系语言基础的可能都比较熟悉scanf("%d",&a);和cin>>a;这种代码,也打开了程序交互的第一道门.因此,这些程序员开始学J ...

  8. 到头来还是逃不开Java - Java13核心类

    Java13核心类 没有特殊说明,我的所有学习笔记都是从廖老师那里摘抄过来的,侵删 引言 兜兜转转到了大四,学过了C,C++,C#,Java,Python,学一门丢一门,到了最后还是要把Java捡起来 ...

  9. Java学习_Java核心类

    字符串和编码 字符串在String内部是通过一个char[]数组表示的,因此,可以按下面的写法: String s2 = new String(new char[] {'H', 'e', 'l', ' ...

  10. java常用类详细介绍及总结:字符串相关类、日期时间API、比较器接口、System、Math、BigInteger与BigDecimal

    一.字符串相关的类 1.String及常用方法 1.1 String的特性 String:字符串,使用一对""引起来表示. String声明为final的,不可被继承 String ...

随机推荐

  1. 小车PID巡线调节

    PID巡线调节 1.双巡线P控制 KP可以先从0.2值调起,P比例主要控制小车能够在线上正常巡线, P比例说明:KP值越小,转弯幅度越大,会直接越过黑线.KP值越大,转弯幅度越小,能正常巡线,但是摆动 ...

  2. DTALK直播预约 | 数据资产管理:金融机构数据价值释放的必经之路

    当前,数据对金融机构业务和发展的重要性日益凸显,释放数据生产力已经成为金融机构进行全面数字化转型的核心,这就要求金融机构以数据资产为纲不断提升自身数据资产管理能力. 本期DTALK我们邀请到雅拓信息解 ...

  3. 电气设计软件有哪些?EPLAN让你成为专业工程师

    作为一名电气设计师,掌握适合自己的设计软件至关重要.在本文中,我们将向您介绍五款广受欢迎的电气设计软件,无论您是初学者还是专业设计师,这些软件都能帮助您轻松完成各类电气设计任务.让我们一起来了解这些实 ...

  4. AI应用实战课学习总结(7)聚类算法分析实战

    大家好,我是Edison. 最近入坑黄佳老师的<AI应用实战课>,记录下我的学习之旅,也算是总结回顾. 今天是我们的第7站,一起了解下聚类算法基本概念 以及 通过聚类算法辅助用户画像的案例 ...

  5. 4.分布式事务方案-Saga

    1. Saga是什么 保证最终一致性的一种分布式事务方案 2. Saga流程 有多个事务参与者,每个参与者都有两块逻辑:正向操作和逆向操作 把事务分成两个阶段 第一阶段每个参与者执行正向操作 第二阶段 ...

  6. java--Struts数据回显、模型驱动、防止表单重复提交

    Struts数据效验 表单数据的验证: 前台验证:主要是通过JS验证, 表单数据是否合法! 后台验证:通过后台java代码进行验证! Struts也提供了数据效验的方式! Struts数据效验, 通过 ...

  7. iis6导出Excel报错检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件时失败,8000401a错误解决办法

    1:在服务器上安装office的Excel软件. 2:在"开始"->"运行"中输入dcomcnfg.exe启动"组件服务" 3:依次双 ...

  8. sox 音频转换不求人 amixer 是alsa的命令行工具,对于声卡的参数的配置.

    在线音频转换,奈何公司的网速太慢,一个mp3 转换成的wav 的大小几乎会达到12M 其实sox可以很无脑的完成这些操作 sox 1.mp3 1.wav sox 1.mp3 1.ogg sox几乎支持 ...

  9. 电脑端,读取嵌入式的ldd 描述可执行文件的共享库

    电脑端,读取嵌入式的ldd 描述可执行文件的共享库 arm-linux-gnueabihf-readelf -d example

  10. C-Kermit 连接 Microchip WBZ451 Curiosity Board实例

    The Kermit Project | Now hosted by Panix.com New York City USA • kermit@kermitproject.org -since 198 ...