1. BigDecimal 用于解决浮点型运算时,出现结果失真的问题。
2. BigDecimal创建的构造器、常用方法
构造器 | 说明 |
public BigDecimal(double val)---不推荐 | 将double 类型转为BigDecimal |
public BigDecimal(String val)---推荐 | 将String 类型转为BigDecimal |
方法 | 说明 |
public static BigDecimal valueOf(double val) | 将double 转换成BigDecimal |
public BigDecimal add(BigDecimal augend) | 加法 |
public BigDecimal subtract(BigDecimal subtrahend) | 减法 |
public BigDecimal multiply(BigDecimal multiplicand) | 乘法 |
public BigDecimal divide(BigDecimal divisor) | 除法 |
public BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode) | 除法、精确几位、舍入模式 |
public double doubleValue() | 将 BigDecimal 转换成double |
public int compareTo(BigDecimal 值) | 将此数字与指定的 进行比较;-1(小于)、0 (等于)或 1(大于) |
舍入模式 | 说明 |
ROUND_UP | 舍入模式,从零开始舍入。不管保留数字后面是大是小 (0 除外) 都会加 1 |
ROUND_DOWN | 舍入模式,向零舍入。舍去值,截断操作,后面所有数字直接去除 |
ROUND_CEILING | 舍入模式,向正无穷大舍入。向正无穷方向对齐,转换为正无穷方向最接近的数值。如果为正数,行为和 ROUND_UP 一样;如果为负数,行为和 ROUND_DOWN 一样。此模式不会减少数值大小 |
ROUND_FLOOR | 舍入模式,向负无穷大舍入。向负无穷方向对齐。如果为正数,行为和 ROUND_DOWN 一样;如果为负数,行为和 ROUND_UP 一样。此模式不会增加数值大小 |
ROUND_HALF_UP | 四舍五入 |
ROUND_HALF_DOWN | 五舍六入 |
ROUND_HALF_EVEN | 四舍六入五成双,如果要舍入的数字是5,并且5后面没有其他数字,或者5后面的数字全为0,则会检查5前面的数字。如果5前面的数字是奇数,则向上舍入;如果是偶数,则向下舍入 |
ROUND_UNNECESSARY | 舍入模式可以断言所请求的操作具有准确的结果,因此不需要舍入。如果在产生不精确结果的操作上指定了这种舍入模式,则会引发ArithmeticException |
public static void main(String[] args) {//BigDecimal//1. public BigDecimal(String val) 将String 类型转为BigDecimal ---推荐BigDecimal a = new BigDecimal("3.00");System.out.println(a);//3.00//2. public static BigDecimal valueOf(double val) //将double 转换成BigDecimalBigDecimal b = BigDecimal.valueOf(5.00);System.out.println(b);// 5.0//public BigDecimal add(BigDecimal augend) 加法System.out.println(a.add(b));//8.00//public BigDecimal subtract(BigDecimal subtrahend) 减法System.out.println(a.subtract(b));//-2.00//public BigDecimal multiply(BigDecimal multiplicand) 乘法System.out.println(a.multiply(b));//15.000//public BigDecimal divide(BigDecimal divisor) 除法System.out.println(a.divide(b));//0.6//public BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode) 除法、精确几位、舍入模式System.out.println(a.divide(b, 2, BigDecimal.ROUND_HALF_UP));//0.60//public double doubleValue() 将 BigDecimal 转换成doubledouble d = a.doubleValue();System.out.println(d);//3.0//public int compareTo(BigDecimal 值) 将此数字与指定的 进行比较;1(小于)、0 (等于)或 1(大于)System.out.println(a.compareTo(b));//-1 3.00小于5
}
3. BigDecimal 的等值比较使用 compareTo方法,而不是equals方法;equals会比较值和精度,compareTo则会忽略精度
4. 禁止使用构造方法 public BigDecimal(double val)- 把double 转为BigDecimal ;BigDecimal(double val)存在精度损失风险
5. 推荐使用public BigDecimal(String val) 或 public static BigDecimal valueOf(double val)构造器