java编码中注意问题的总结

試著忘記壹切 提交于 2019-11-28 10:24:32

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,再用作下标

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!