BigDecimal类型的使用:
简介:
Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。
使用情况:
在一些浮点数做运算时,会导致浮点数的精度缺失.
构造方法:
方法名称 | 方法解释 |
BigDecimal(int) | 创建一个具有参数所指定整数值的对象 |
BigDecimal(double) | 创建一个具有参数所指定双精度值的对象。(不建议采用) |
BigDecimal(long) | 创建一个具有参数所指定长整数值的对象 |
BigDecimal(String) | 创建一个具有参数所指定以字符串表示的数值的对象 (建议使用) |
为什么double类型的不建议使用:
因为在jdk描述中double的构造方法有一定的不可预知性.new BigDecimal(0.1) 中的0.1可能是0.10000000004.
解决方法:
建议使用String类型的构造方法,这里的值是可预期的,可以把double类型转换为String类型
转换方式,建议使用 Double.toString(),或是是 + “” 的形式
运算方法(及类型转换方法):
方法名称 | 方法解释 |
add(BigDecimal) | 加法 |
subtract(BigDecimal) | 减法 |
multiply(BigDecimal) | 乘法 |
divide(BigDecimal) | 除法 |
toString() | 转换为字符串 |
doubleValue() | 以双精度数返回 |
floatValue() | 以单精度数返回 |
longValue() | 以长整数返回 |
intValue() | 以整数返回 |
注意:
divide(BigDecimal) ,除法会出现有余数不能整除的情况,这个时候会出现java.lang.ArithmeticException(算数异常)
解决方法:
我们要对结果进行保留相应位数的小数,并且选择舍入模式.
divide(BigDecimal,保留小数点后几位小数,舍入模式)
ROUND_CEILING //向正无穷方向舍入(ceiling)
ROUND_DOWN //向零方向舍入 (down)
ROUND_FLOOR //向负无穷方向舍入 (floor)
ROUND_HALF_DOWN //向(距离)最近的一边舍入,除非两边(的距离)是相等,向下舍入, 例如1.55 保留一位小数结果为1.5
ROUND_HALF_EVEN //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果保留位数是奇数,使用 ROUND_HALF_UP,如果是偶数,使用ROUND_HALF_DOWN (round_half_down(up))
ROUND_HALF_UP //向(距离)最近的一边舍入,除非两边(的距离)是相等,向上舍入, 1.55保留一位小数结果为1.6,(四舍五入)
ROUND_UNNECESSARY //计算结果是精确的,不需要舍入模式 (round_unnecessary)
ROUND_UP //向远离0的方向舍入
精确小数点位数:
BigDecimal.setScale():