zoukankan      html  css  js  c++  java
  • D/double精度误解

    开头

    每次double比较大小的时候总得纠结一下,一直以来用的都是BigDecimal,网上几乎都说double不能用基础的比较运算符去比较会有精度问题,今天就故意尝试了一下,发现基础比较运算符也能用。

    特意记录一下

    double

    double a = 2.0-1.1;
    double b = 0.9;
     
    double c1 = 0.01;
    double c2 = 0.01;
    方法一:
    System.out.println(a==b); //false
    System.out.println(c1==c2); //true
     
    方法二:
    BigDecimal data1 = new BigDecimal(a);
    BigDecimal data2 = new BigDecimal(b);
    System.out.println(data1.compareTo(data2));//-1
     
    方法三:
    double d = 0.000001;
    System.out.println(Math.abs(a - b) < d); //true
     
    方法四:
    System.out.println(Double.doubleToLongBits(a)==Double.doubleToLongBits(b)); //false
     
    方法五:
    转换成字符串
    该种方法没有试,网上说只适用于比较精度相同的数据,并且是只用用于比较是否相等的情况下,不能用来判断大小。
     

     

    Double

    因为Double是包装类型,基础的比较运算符比较的是地址值,所以不能用
    需要用BigDecimal去比较,这里就不再复述了,跟上面方法二类似
     
     
     

    总结

    double下比较大小,基础的比较运算符就可以了(网上很多都误导了说有精度问题)
    Double因为是包装类型,建议用BigDecimal去比较
    如果涉及到运算,无论是double和Double都有可能涉及精度问题,建议Math.abs(a - b) < 0.00000001
     
     

    相关材料

    网上大部分误导了说double不能用基础的比较运算符:
     
    声明double变量的时候,加d与不加d有什么区别:
    明确说明了变量的类型是double,所以加不加d都是一样的;
    但在某些情况下是不一样的,例如x1 = 1d就能知道x1是double类型的; x2 = 1就无法确定x2的类型;

     

    写在最后

    这是自己在代码上试的,不知道有没有哪里没理解好的,有哪里错的请指出谢谢~

    路很长,请保持耐心。
  • 相关阅读:
    js对象深拷贝
    数组去重
    css布局之双飞翼布局
    css布局之圣杯布局
    在浏览器中输入URL并回车后都发生了什么?
    浮动和清除浮动
    Javascript 构造函数模式、原型模式
    Javascript之对象组合继承
    js可以随意拖拽的div的实现
    博客美化 之博客的魔方效果
  • 原文地址:https://www.cnblogs.com/SI0301/p/15492635.html
Copyright © 2011-2022 走看看