概述
Double类型在计算的时候可能会出现精度丢失问题。
例: 0.1667*100.0 = 16.669999999999999999999999
为了避免Double类型计算时候精度丢失问题。有两种方法可以解决。
第一种方法:计算时处理
写了一个方法如下:
/**
* double类型计算,避免精度丢失。
*
* @param d1
* @param d2
* @param operatorType,目前支持“+”、“-”、“*”、“/”
* @return
*/
public static double doubleMathCalculation(double d1, double d2, String operatorType) {
BigDecimal bigDecimal1 = new BigDecimal(String.valueOf(d1));
BigDecimal bigDecimal2 = new BigDecimal(String.valueOf(d2));
double resultValue = 0.0;
switch (operatorType) {
case "+":
resultValue = bigDecimal1.add(bigDecimal2).doubleValue();
break;
case "-":
resultValue = bigDecimal1.subtract(bigDecimal2).doubleValue();
break;
case "*":
resultValue = bigDecimal1.multiply(bigDecimal2).doubleValue();
break;
case "/":
// 除法保留2位小数,向上取整,四舍五入
resultValue = bigDecimal1.divide(bigDecimal2, 2, BigDecimal.ROUND_HALF_UP).doubleValue();
break;
default:
break;
}
return resultValue;
}
大致方法如上,主要是运用BigDecimal类里面的方法来处理。也可以根据自生需求进行改造
第二种方法:结果值处理
就是正常用double类型计算,然后对计算结果重新进行精度确认
/**
* 取小数点后保留几位小数后的值。
*
* @param d
* @param point
* @param hasRound
* @return
*/
public static double getDecimalPoint(double d, int point) {
BigDecimal bg = new BigDecimal(d);
double f = 0.0;
/**
*hasRound:为true则需要做四舍五入,为false则走getDecimalPoint方法
*ROUND_UP:非0时,舍弃小数后(整数部分)加1,比如12.49结果为13,-12.49结果为 -13
*ROUND_DOWN:直接舍弃小数
*ROUND_CEILING:如果 BigDecimal 是正的,则做 ROUND_UP 操作;如果为负,则做 ROUND_DOWN 操作 (一句话:取附近较大的整数)
*ROUND_FLOOR: 如果 BigDecimal 是正的,则做 ROUND_DOWN 操作;如果为负,则做 ROUND_UP 操作(一句话:取附近较小的整数)
*ROUND_HALF_UP:四舍五入(取更近的整数)
*ROUND_HALF_DOWN:跟ROUND_HALF_UP 差别仅在于0.5时会向下取整
*ROUND_HALF_EVEN:取最近的偶数
*ROUND_UNNECESSARY:不需要取整,如果存在小数位,就抛ArithmeticException 异常
*/
//先上取整,四舍五入
f = bg.setScale(point, BigDecimal.ROUND_HALF_UP).doubleValue();
return f;
}
如果有更好的方法欢迎大家留言讨论。
最后
以上就是干净外套为你收集整理的Double类型计算解决精度丢失问题的全部内容,希望文章能够帮你解决Double类型计算解决精度丢失问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复