Double类型在计算的时候可能会出现精度丢失问题。
例: 0.1667*100.0 = 16.669999999999999999999999
为了避免Double类型计算时候精度丢失问题。有两种方法可以解决。
第一种方法:计算时处理
写了一个方法如下:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31/** * 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类型计算,然后对计算结果重新进行精度确认
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27/** * 取小数点后保留几位小数后的值。 * * @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类型计算解决精度丢失问题内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复