BigDecimal
大约 2 分钟
相关信息
BigDecimal 作为要求浮点计算精度时的数据类型。BigDecimal 是不可变的的,在进行每一步运算时,都会产生一个新的对象,由于创建对象会引起开销,因此不适合于大量的数学运算。
构造方法
BigDecimal 构造方法有 4 种参数类型,两个用 BigInteger
构造,另一个是用 double
构造,还有一个使用 String
构造。
应避免使用 double
构造,有些数字 double
无法精确表示,传递给 BigDecimal
时已经不精确。应该用 String
构造 BigDecimal
.
new BigDecimal(0.1);// 得到的值是 0.1000000000000000055511151231257827021181583404541015625
new BigDecimal("0.1");// 得到的值是 0.1
比较
使用 compareTo()
比较两个 BigDecimal 值。
Bigdecimal b1 = new BigDecimal("0.1");
Bigdecimal b2 = new BigDecimal("0.1");
Bigdecimal b3 = new BigDecimal("0.10");
b1.equals(b2); // true
b1.equals(b3); // false
b1.compareTo(b2); //true
b1.compareTo(b3); //true
API
API | 描述 |
---|---|
add() | 相加 |
subtract() | 相减 |
multiply() | 相乘 |
divide() | 相除 |
doubleValue() | 转换为 double 类型 |
compareTo() | 比较两个值 |
舍入模式
任意精度的小数运算仍不能表示精确结果,经常产生无限循环的小数。BigDecimal 可以显式地控制舍入模式。
RoundingMode
中有舍入模式枚举:
DOWN
:零向舍入,舍弃后边所有,不向前进 1.UP
:舍入去零,零不舍入。HELF_DOWN
:四舍五入规则,大于 5 向前一位进 1.HELF_UP
:四舍五入规则,大于等于 5 向前一位进 1.
// 自定义配置对象(四舍五入保留 3 位有效数字)
MathContext mc1 = new MathContext(3, RoudingMode.HELF_UP);
b1.setScale(3, RoundingMode.HALF_UP); //保留3位小数
BigDecimal b3 = new BigDecimal("3.1415926");
// 使用自定义配置对象
System.out.println(b3.round(mc1)) //3.14
常量
Bigdecimal
提供了常用的数值常量,不需要额外创建对象。
Bigdecimal.ZERO
:表示 0.
格式化
DecimalFormat
对象可以对 Bigdecimal
数据类型进行格式化。
// 声明格式化对象
DecimalFormat df1 = new DecimalFormat("#,###.000");
System.out.println(df1.format(1234.527));
// 结果:1,234.527
// 声明格式化对象
DecimalFormat df2 = new DecimalFormat("#.00");
System.out.println(df2.format(1234.527));
// 结果:1234.53(发生四舍五入)
// 声明格式化对象
DecimalFormat df3 = new DecimalFormat("##.00%");
System.out.println(df3.format(0.527));
// 结果:52.70%(百分比格式,后面不足2位的用0补齐)
// 切换为百分比格式,声明数值格式化对象
NumberFormat nf = NumberFormat.getPercentInstance();
// 保留到小数点后几位
nf.setMinimumFractionDigits(3);
System.out.println(nf.format(0.527));
// 结果:52.700%
System.out.println(String.format("%02d", 5));
// 结果:05
System.out.println(String.format("%.3f", 3.14159));
// 结果:3.142,%. 表示小数点前任意位数, 2 表示两位小数, f 表示浮点型
NumberFormat format = NumberFormat.getNumberInstance();
format.setMinimumFractionDigits(3);//设置小数部分允许的最小位数
format.setMaximumFractionDigits(5);//设置小数部分允许的最大位数
format.setMaximumIntegerDigits(10);//设置整数部分允许的最大位数。
format.setMinimumIntegerDigits(0);//设置整数部分允许的最小位数
System.out.println(format.format(2132323213.23266666666)); 2,132,323,213.23267