浅挖Java的BigDecimal类
浅挖Java
的BigDecimal
类
特点:比浮点运算精确,一般会用于计算金额等
BigDecimal
底层实现
-
内部字段:
-
BigDecimal
类的核心字段包括:private final BigInteger intVal; // 表示数字的整数部分,精度极高 private final int scale; // 表示小数位数 private transient int precision; // 可选字段,表示总有效数字位数(非每次都计算)
BigInteger
是任意精度的整数类型,用于存储整个数字的值。通过将小数部分的精度单独存储为scale
,BigDecimal
实现了浮点数计算的任意精度。
-
-
数值表示方式:
BigDecimal
将数值存储为整数(通过BigInteger
实现),并通过scale
控制小数位置。例如,123.45
将存储为12345
,scale
为2
。scale
定义了小数位数。当scale
为正数时,表示小数位数;为负数时,则表示数值按10
的整数倍放大。
-
精确计算:
BigDecimal
的计算方法(如加、减、乘、除)不会造成精度丢失。乘除法运算会根据scale
自动调整结果的精度。- 与
double
和float
类型的浮点数不同,BigDecimal
的数值不会受限于机器浮点表示的误差问题,可以实现无限精度的十进制数计算。
-
不可变性:
BigDecimal
是不可变类,每次运算都会返回一个新的对象,不会修改原始对象的值。这保证了线程安全性以及数值计算的稳定性。
-
舍入模式:
BigDecimal
提供了多种舍入模式,如HALF_UP
、HALF_DOWN
等,可以在除法或精度调整时选择合适的舍入模式,以确保计算的精度符合要求。
示例代码
import java.math.BigDecimal;public class BigDecimalExample {public static void main(String[] args) {BigDecimal a = new BigDecimal("123.45");BigDecimal b = new BigDecimal("67.89");BigDecimal result = a.add(b);System.out.println("结果: " + result); // 精确结果}
}
所以BigDecimal
的的核心是底层,基于 BigInteger
存储高精度整数值,通过 scale
控制小数位置,从而实现任意精度的十进制数表示和计算。