1. java中的浮点数比较事项
1.1 若精度要求不高,比如因为传感器有误差,小于0.001的数都可以认为等于0,那么就定义epsilon = 0.001:
1 private final double epsilon = 1e-9; 2 double double_x = 0.0; 3 if(Math.abs(double_x - 0) < epsilon) 4 { 5 System.out.println("true"); 6 }
1.2 转换成字符串之后用equals方法比较
1 Double.toString(double_x).equals(Double.toString(double_y))
注意:这种方法只适用于比较精度相同的数据,并且是只用用于比较是否相等的情况下,不能用来判断大小。
1.3 转换成Long之后用==方法比较
Sun提供了一种将Double类型转换成Longo类型的方法,即Double.doubleToLongBits()方法,从而可以使double按照long的方法(<, >, ==)判断是否大小和是否相等。
1 Double.doubleToLongBits(0.01) == Double.doubleToLongBits(0.01; 2 Double.doubleToLongBits(0.02) > Double.doubleToLongBits(0.01); 3 Double.doubleToLongBits(0.02) < Double.doubleToLongBits(0.01) ;
1.4 使用BigDecimal类型的equals方法或compareTo方法
使用字符串形式的float型和double型构造BigDecimal:BigDecimal(String val)。BigDecimal的euquals方法是先判断要比较的数据类型,如果对象类型一致前提下同时判断精确度(scale)和值是否一致;compareTo方法则不会比较精确度,把精确度低的那个对象转换为高精确度,只比较数值的大小。
1 import java.math.BigDecimal; 2 3 System.out.println(new BigDecimal("1.2").equals(new BigDecimal("1.20"))); //输出false 4 System.out.println(new BigDecimal("1.2").compareTo(new BigDecimal("1.20")) == 0); //输出true 5 6 System.out.println(new BigDecimal(1.2).equals(new BigDecimal("1.20"))); //输出false 7 System.out.println(new BigDecimal(1.2).compareTo(new BigDecimal("1.20")) == 0); //输出false 8 9 System.out.println(new BigDecimal(1.2).equals(new BigDecimal(1.20))); //输出true 10 System.out.println(new BigDecimal(1.2).compareTo(new BigDecimal(1.20)) == 0);//输出true
2. 判断一个整数是否为奇数,用x%2 !=0,而非x%2 ==1,因为x可能为负数
3. 用char的值作为数组下标(例如统计字符串中每个字符出现的次数),因为考虑char可能是负数的问题,正确的做法应该是,先将其强制转换为unsigned char,再用作下标