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); //trueAPI
| 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