当前位置:   article > 正文

double类型相加(減、乘、除)结果会有些误差

double类型相加

前提介绍

      今天在调试代码的时候发现了一个double类型数据相减的有趣问题,148163.1 - 82692.09大家猜猜结果等于多少,经过调试最终为5471.010000000009。

是不是很奇怪,下面将说明这其中的奥妙!

原因说明

     double属于floating binary point types,也就是说都double型的数值在相加减的时候,会将数值转换成二进制的数值如10001.10010110011这种表示发再做相加减,但是在转换成二进制代码表示的时候,存储小数部分的位数会有不够的现象,即无限循环小数,这就是造成微差距的主要原因。

解决方法

1.只取需要用到的位数:

 小数点台后面的位数部分就不要管了,不过这种方法不太好。

 2.使用Decimal类型:

 用Decimal就不会出现上面的问题了,可以准确的计算小数值,知识Decimal的范围比double小,一般情况下也够用了

 Decimal类型的有效位数达到28位,而double类型的16位,所以Decimal类型比Double类型能表示更精确的浮点数。

总结

1.在double类型数值进行比较大小的情况最好使用1.02-1.01==double.MinValue这种方式进行判断

2.使用double类型进行加减的情况下看看能否使用Decimal类型进行计算


  1. package org.lxh.demo11.numberdemo;
  2. import java.math.BigDecimal;
  3. class MyMath {
  4. public static double add(double d1, double d2)
  5. { // 进行加法运算
  6. BigDecimal b1 = new BigDecimal(d1);
  7. BigDecimal b2 = new BigDecimal(d2);
  8. return b1.add(b2).doubleValue();
  9. }
  10. public static double sub(double d1, double d2)
  11. { // 进行减法运算
  12. BigDecimal b1 = new BigDecimal(d1);
  13. BigDecimal b2 = new BigDecimal(d2);
  14. return b1.subtract(b2).doubleValue();
  15. }
  16. public static double mul(double d1, double d2)
  17. { // 进行乘法运算
  18. BigDecimal b1 = new BigDecimal(d1);
  19. BigDecimal b2 = new BigDecimal(d2);
  20. return b1.multiply(b2).doubleValue();
  21. }
  22. public static double div(double d1,
  23. double d2,int len) {// 进行除法运算
  24. BigDecimal b1 = new BigDecimal(d1);
  25. BigDecimal b2 = new BigDecimal(d2);
  26. return b1.divide(b2,len,BigDecimal.
  27. ROUND_HALF_UP).doubleValue();
  28. }
  29. public static double round(double d,
  30. int len) { // 进行四舍五入
  31. 操作
  32. BigDecimal b1 = new BigDecimal(d);
  33. BigDecimal b2 = new BigDecimal(1);
  34. // 任何一个数字除以1都是原数字
  35. // ROUND_HALF_UP是BigDecimal的一个常量,
  36. 表示进行四舍五入的操作
  37. return b1.divide(b2, len,BigDecimal.
  38. ROUND_HALF_UP).doubleValue();
  39. }
  40. }
  41. public class BigDecimalDemo01 {
  42. public static void main(String[] args) {
  43. System.out.println("加法运算:" +
  44. MyMath.round(MyMath.add(10.345,
  45. 3.333), 1));
  46. System.out.println("乘法运算:" +
  47. MyMath.round(MyMath.mul(10.345,
  48. 3.333), 3));
  49. System.out.println("除法运算:" +
  50. MyMath.div(10.345, 3.333, 3));
  51. System.out.println("减法运算:" +
  52. MyMath.round(MyMath.sub(10.345,
  53. 3.333), 3));
  54. }
  55. }


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/802690
推荐阅读
  

闽ICP备14008679号