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的类型;

 

写在最后

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

posted @ 2021-11-01 11:15  SI3  阅读(110)  评论(0编辑  收藏  举报