BigDecimal类型的使用:
简介:

Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。

使用情况:

在一些浮点数做运算时,会导致浮点数的精度缺失.

decimal类型比较大小java decimal java用啥类型_java

构造方法:

方法名称

方法解释

BigDecimal(int)

创建一个具有参数所指定整数值的对象

BigDecimal(double)

创建一个具有参数所指定双精度值的对象。(不建议采用)

BigDecimal(long)

创建一个具有参数所指定长整数值的对象

BigDecimal(String)

创建一个具有参数所指定以字符串表示的数值的对象 (建议使用)

为什么double类型的不建议使用:

因为在jdk描述中double的构造方法有一定的不可预知性.new BigDecimal(0.1) 中的0.1可能是0.10000000004.

decimal类型比较大小java decimal java用啥类型_java_02

解决方法:

建议使用String类型的构造方法,这里的值是可预期的,可以把double类型转换为String类型

转换方式,建议使用 Double.toString(),或是是 + “” 的形式

decimal类型比较大小java decimal java用啥类型_后端_03

运算方法(及类型转换方法):

方法名称

方法解释

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的方向舍入


decimal类型比较大小java decimal java用啥类型_java_04

精确小数点位数:

BigDecimal.setScale():

decimal类型比较大小java decimal java用啥类型_ide_05