首先看下java 处理精度问题的一个问题,如下图:

这是java处理的加减乘除的测试类,可以看出问题不正常,当我I们在计算精度问题的时候,就会出现进度丢失的问题!
看下BigDecimal处理这些加减乘除问题如下为如所示:

结果显示精度丢失更加严重,按道理来说应该不会出现这样问题,出现这个问题的原因是什么? 接下来看第三个demo如下图

这样情况就很明显了,是我们想要的结果,使用的是String的BigDecimal构造器计算结果,所以在我们选择计算金额时候一定要选择String的构造器,问题来了 为什么要选择String构造函数进行加减运算;看下源码都知到


意思是在用的时候需要将Double类型转为String类型构造器在商业用途中!
这里提供一个BigDecimal的工具类,可以省去在精度计算的时候类型间互相转换的问题(比较拙劣,仅供参考);
/**
* Created by :Corey
* 14:24 2019/1/2
* BigDecimal 计算工具了
*/
public class BigDecimalUtils {
private BigDecimalUtils() {
}
/**
* 加法
*
* @param v1
* @param v2
* @return
*/
public static BigDecimal add(double v1, double v2) {
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.add(b2);
}
/**
* 减法
*
* @param v1
* @param v2
* @return
*/
public static BigDecimal sub(double v1, double v2) {
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.subtract(b2);
}
/**
* 乘法
*
* @param v1
* @param v2
* @return
*/
public static BigDecimal mul(double v1, double v2) {
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.multiply(b2);
}
/**
* 除法
*
* @param v1
* @param v2
* @return
*/
public static BigDecimal div(double v1, double v2) {
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.divide(b2, BigDecimal.ROUND_HALF_UP);//四舍五入
}
}
本文探讨了Java处理浮点数运算时的精度丢失问题,通过对比直接使用基本类型和BigDecimal类的运算结果,揭示了精度问题的本质。文章强调了在金融等需要高精度计算的场景下,使用BigDecimal类并配合String构造器的重要性,并提供了一个实用的BigDecimal工具类。

被折叠的 条评论
为什么被折叠?



