【Java-Day17】API篇-BigInteger和BigDecimal

BigInteger和BigDecimal这两个类都在 java.math 包里,都是用来解决"普通数字类型不够用"的问题。

  • BigInteger:处理特别大的整数。
  • BigDecimal:处理精确的小数,尤其适合金额计算。

一.BigInteger

1.1 BigInteger是什么:

BigInteger 是 Java 提供的一个类,用来表示:特别大的整数。

1.2 为什么要有BigInteger:

普通整数类型有范围限制:如int long。数字超过 long 的范围,普通整数类型就装不下。

这时可以使用 BigInteger ,它可以表示非常非常大的整数。

1.3 创建 BigInteger 对象

对象一旦创建,内部值就不可变

类型 方法 / 构造方法 说明
构造方法 public BigInteger(String val) 获取指定的大整数
静态方法 public static BigInteger valueOf(long val) 静态方法获取 BigInteger 对象,内部有优化

1.3.1 构造方法创建对象(new)

每一次都是创建了一个新的BigInteger对象。用==比较是false。

java 复制代码
BigInteger num = new BigInteger("999999999999999999999");

1.3.2 静态方法创建对象(valueOf)

用valueOf创建对象时,当BigInteger加载到内存的时候,提前把 -16~16 之间每一个小整数都创建了BigInteger 对象 ,共33个,放入到数组中(缓存优化)。重复获取这些数字时,可以复用已有对象。

也就是当你创建两个16,用==比较,是true,创建两个17,就是false

目的:跟Integer(默认缓存:-128 ~ 127)是一样的,当使用频率高的时候,节约内存

注意 :valueOf里传的只能是**long类型数据(**最高19位)

java 复制代码
BigInteger a = BigInteger.valueOf(16);

1.4 BigInteger 的常见成员方法

方法名 说明
public BigIntegeradd(BigInteger val) 加法
public BigInteger subtract(BigInteger val) 减法
public BigInteger multiply(BigInteger val) 乘法
public BigIntegerdivide(BigInteger val) 除法,获取商
public BigInteger\[\] divideAndRemainder(BigInteger val) 除法,获取商和余数
public boolean equals(Object x) 比较是否相同
public BigIntegerpow(int exponent) 次幂
public BigInteger max(BigInteger val) 返回最大值
public BigInteger min(BigInteger val) 返回最小值

二.BigDecimal

2.1 什么是BigDecimal

BigDecimal 是 Java 提供的一个类,用来表示:精确的小数。

2.2 为什么要有BigDecimal

因为 double 和 float 计算小数可能有**精度问题。**计算机底层用二进制表示小数,很多十进制小数不能被精确表示。

BigDecimal的作用:

  • 用来表示很大的小数
  • 用于小数的精确计算

BigDecimal的存储规则:

用 byte 类型的数组存储小数里的数据(把小数里面的每一个数字提取出来,用ASCII码表示,然后存在数组当中),避免数据丢失,保证数据的精确运算

2.3 创建 BigDecimal对象

结论:
如果当前的小数,是在double的取值范围之内的,使用静态方法获取对象
如果超出了double的取值范围,使用构造方法获取对象(参数必须要以字符串的形式进行体现)

构造方法 说明
public BigDecimal(double val) 获取指定的 BigDecimal 对象,不推荐使用
public BigDecimal(String val) 获取指定的 BigDecimal 对象,推荐使用
静态方法 说明
public static BigDecimal valueOf(long val) 静态方法获取 BigDecimal 对象,内部有优化

2.3.1 构造方法获取对象(new)

注意:

  • 给构造方法传递一个double类型的小数(错误)
  • 传递过来的数据就是不精确
java 复制代码
BigDecimal b1 = new BigDecimal("1.5");

2.3.2 静态方法获取对象(valueOf)

缓存优化:0~10提前创建好,放到数组当中

java 复制代码
BigDecimal b2 = BigDecimal.valueOf(1.5);

2.4 BigDecimal类的常见成员方法

方法名 说明
public static BigDecimal valueOf(double val) 获取对象
public BigDecimal **add(**BigDecimal val) 加法
public BigDecimal subtract(BigDecimal val) 减法
public BigDecimalmultiply(BigDecimal val) 乘法
public BigDecimal divide(BigDecimal val) 除法,获取
public BigDecimaldivide(BigDecimal val, int scale, RoundingMode roundingMode) 除法,指定精确位数和舍入模式(保留小数整体

舍入规则:

四舍五入:RoundingMode.HALF_UP

相关推荐
benbenAItalk6 小时前
数字人口播视频的批量生产实践:素材规范、任务编排与质量验收
java·前端·音视频
sunshine22 girl6 小时前
Java学习二 基本语法2, 算术运算符
java·学习
2601_966949657 小时前
为什么量化策略需要大量历史股票数据?从回测可信度理解数据规模
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
niucloud-admin7 小时前
JAVA V6 多商户商城 开发文档——插件目录结构
java·开发语言
2601_962885727 小时前
如何用 Python 扫描 A 股跳空缺口并统计缺口回补概率?
java·前端·python
滕州市燕猫虎计算机科技工作室个体工商户7 小时前
Java锁
java·开发语言
多加点辣也没关系7 小时前
JavaScript|第31章:表单与控件
开发语言·javascript·ecmascript
菜鸟~noob2338 小时前
【电子战】 第09篇:阵列信号处理——波束形成、MVDR、MUSIC【含matlab代码】
开发语言·matlab·信号处理
ocean21038 小时前
2025-2026年Python面试高频知识点洞察
开发语言·python·面试·python八股文
零依赖极客8 小时前
Day 6·1 ARMv8.2 dotprod——vdotq_s32 一条指令做 4 个点积
c语言·开发语言·人工智能·矩阵·arm·vllm