BigDecimal类-解决浮点数计算精度问题
BigDecimal
在开发过程中,我们会遇到一些需要严格要求浮点数计算精度的场景。此时,使用float,double等类型是满足不了需求的。案例如下:
1 | public static void main(String[] args) { |
这段代码会返回0.3吗?
我们可以看到运算的结果并不精确。
此时我们就需要使用BigDecimal来解决这种问题。
构造器
我们可以看到有些构造器,接收的是一个double类型的参数。这个地方需要特别注意,我们不应该使用这些构造器。使用这些构造器仍然会有可能造成精度问题。
JDK的描述:参数类型为double的构造方法的结果具有一定的不可预知性。有人可能会认为在Java中写入new BigDecimal(0.1),所创建的BigDecimal正好等于0.1,但是它实际上等于0.1000000000000000055511151231257827021181583404541015625。这是因为0.1无法准确地表示为double。这样,传入到构造方法的值不会正好等于0.1(虽然表面上等于该值)。
正确姿势
1 | double a = 0.1; |
其中**new BigDecimal(Double.toString(a));和BigDecimal b2 = BigDecimal.valueOf(b);**是相等的。
可以查看valueOf的源码
常用api
加减乘除
1 | double a = 0.1; |
其中需要注意的是,除法需要指定运算精度,否则遇到除不尽的情况会保存
转换成double
1 | double d = b2.doubleValue(); |