判断奇数
正确做法:
public static boolean isOdd(int i) {
return (i & 1) != 0;
}
不能 i % 2 == 1
,当 i 为负数时,求余数结果为 -1
double 精度问题
浮点运算只提供近似计算,不能产生精确结果,二进制浮点不能用于货币计算。
2.00 - 1.10
并不是精确等于 0.90 而可能是 0.8999999
解决方法一,使用整数类型,以货币单位分计算,保证整数类型足够大可以覆盖所有计算范围。
方式二,使用 BigDecimal,精确计算小数,另外一定要用
BigDecimal(String)
String 构造器,而不要用 BigDecimal(double)
构造函数。
长整数
一天的微秒除以一天的毫秒数,理论结果应该是 1000,但实际是 5.
public class LongDivision{
public static void main(String args[]){
final long MICROS_PER_DAY = 24 * 60 * 60 * 1000 * 1000;
final long MILLIS_PER_DAY = 24 * 60 * 60 * 1000;
System.out.println(MICROS_PER_DAY/MILLIS_PER_DAY);
}
}
long 类型可以保存这两个乘积,没有溢出。但问题在于 MICROS_PER_DAY 计算以 int 来执行的,只有运算完成才会提升到 long,而此时计算已经溢出。
乘数因子为 int 时,相乘得到另一个 int。存储结果的变量的类型会影响到计算所使用的类型。
当你在操作很大的数字时,千万要提防溢出。