BigDecimal类
1. 问题
浮点数做运算时精度出现问题。
double和float采用近似值存储。
如:
double a = 1.0;
double b = 0.9;
// a-b = 0.09999...8
double result = (1.4 - 0.5) / 0.9;
// result = 0.9999...
2. 使用场景
精度要求非常高,需要进行精确运算。
- 位置:java.math包中。
- 作用:精确计算浮点数。
- 创建方式:
BigDecimal bd = new BigDecimal("1.0");
,传参一定要用字符串,字符串是最准确的。
3. 常用方法
BigDecimal add(BigDecimal bd)
加。BigDecimal subtract(BigDecimal bd)
减。BigDecimal multiply(BigDecimal bd)
乘。BigDecimal divide(BigDevimal divisor, int scale, int roudingMode)
除。scale:精确到小数点后几位。
roudingMode:指定小数部分的取舍模式。
四舍五入模式的取值为
BigDecimal.ROUND_HALF_UP
.
4. 使用方法
BigDecimal bd1 = new BigDecimal("1.0");
BigDecimal bd2 = new BigDecimal("0.9");
BigDecimal r1 = bd1.subtract(bd2); // 相减运算,结果为0.1
BigDecimal r2 = bd1.add(bd2); //加法运算,1.9
BigDecimal r3 = bd1.multiply(bd2); //乘法运算,0.90
BigDecimal r4 = new BigDecimal("1.4").subtract(new BigDecimal("0.5")).divide(new BigDecimal("0.9")); // 先相减再相除,结果为1
BigDecimal r5 = new BigDecimal("10").divide(new BigDecimal("3")); // 报异常,除不尽,没有指定需要保留多少位小数
// 可以用divide的重载方法divide(BigDevimal divisor, int scale, int roudingMode);
// divisor 除数;scale 保留多少位小数;roudingMode 保留小数的方法,在BigDBigDecimal r5 = new BigDecimal("10").divide(new BigDecimal("3")); ecimal类的常量中定义。
BigDecimal r5 = new BigDecimal("10").divide(new BigDecimal("3", 2, BigDecimal.ROUND_HALF_UP)); // 被除数10,除数3,保留2位小数,采用四舍五入法取舍。结果为3.33
去除后无用0+使用避免输出科学计数法的字符串
.stripTrailingZeros().toPlainString()