1. double 示例
double d1 = 1.0;
double d2 = 0.9;
// 0.09999999999999998
double value = d1 - d2;
// 0.9999999999999999
double result = (1.4 - 0.5) / 0.9;
double 是近似值存储,若需要进行高精度计算,采用 BigDecimal
2. BigDecimal
作用:精确计算浮点数,常用于财务计算;
一般采用参数为字符串的构造方法,因为字符串是最准确的
public class BigDecimal extends Number implements Comparable<BigDecimal> {
private final BigInteger intVal;
private final int scale;
// 指定以字符串表示数值
public BigDecimal(String val) {
this(val.toCharArray(), 0, val.length());
}
public BigDecimal add(BigDecimal augend) {}
public BigDecimal subtract(BigDecimal subtrahend) {}
public BigDecimal multiply(BigDecimal multiplicand) {}
/**
* scale 小数位
* roundingModel 小数位舍入模式
*/
public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode) {}
// Returns: -1, 0, or 1 as this BigDecimal is numerically less than, equal to, or greater than val.
public int compareTo(BigDecimal val) {}
}
2.1 四则运算
BigDecimal b1 = new BigDecimal("1.0");
BigDecimal b2 = new BigDecimal("0.9");
BigDecimal subtract = b1.subtract(b2);
BigDecimal add = b1.add(b2);
BigDecimal multiply = b1.multiply(b2);
// 链式写法
BigDecimal divide1 = b1.add(b2).divide(new BigDecimal("0.2"));
System.out.println(divide1);
2.2 除法操作
BigDecimal divide = new BigDecimal("10").divide(new BigDecimal("3"));
注意:除不尽时会报错 java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
解法:设置保留的小数位 scale 参数 divide(BigDecimal divisor, int scale, int roundingMode)
BigDecimal value = new BigDecimal("3");
BigDecimal divide2 = new BigDecimal("10").divide(value, 2, BigDecimal.ROUND_HALF_UP);
2.3 小数位
获取小数位
BigDecimal value = new BigDecimal("123.45");
int scale = value.scale(); // 2 位小数
小数位舍入模式
// 直接舍去
public final static int ROUND_UP = 0;
public final static int ROUND_DOWN = 1;
// 四舍五入
public final static int ROUND_HALF_UP = 4;
2.4 比较
BigDecimal d1 = new BigDecimal("123.0");
BigDecimal d2 = new BigDecimal("123.00");
boolean equals = d1.equals(d2); // false, equals() 还会比较小数位scale
int result = d1.compareTo(d2); // 0
3. BigDecimal.valueOf() 与 new BigDecimal(distance)
When @Overrides of synchronized methods are not themselves synchronized, the result can be improper synchronization as callers rely on the thread-safety promised by the parent class.
网友评论