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的类型;
写在最后
这是自己在代码上试的,不知道有没有哪里没理解好的,有哪里错的请指出谢谢~
路很长,请保持耐心。