作者简介:Bloch,google首席工程师EffectiveJava作者,Gafter,google工程师参与过c和c++ 编译器的开发
//1.下面方法是确定其唯一的参数是否为奇数 public static boolean isOdd(int i) { //return i % 2 == 1; error return i % 2 != 0; //or i & 1 != 0 效率更高 }
//2.它会打印什么 public static void zeroTimer() { //2.0-1.1 System.out.println(2.0-1.1); //结果 0.8999999999999999 System.out.println(new BigDecimal("2.0").subtract(new BigDecimal("1.1"))); //结果 0.9,不要用 new BigDecimal(double) 构建,new BigDecimal(.1)会返回一个BigDecimal //需要精确答案的地方避免使用float,double,对于货币计算要用int,long,BigDecimal }
//3.一天里的微秒除以一天的毫秒 public static void longDivision() { 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); //MICROS_PER_DAY计算溢出,打印结果为5 //计算先以int方式计算后结果才保存为long,在这之前计算已经溢出, //java不具有目标确定类型的特性,指存储的变量类型不会影响计算所使用的类型
//修改,将乘积的第一个因子改为long型,在操作很大的数字时,防止发生缄默溢出 final long NEW_MICROS_PER_DAY = 24L*60*60*1000*1000; final long NEW_MILLIS_PER_DAY = 24L*60*60*1000; }
//4.初级问题 public static void elementary() { System.out.println(12345+5432l); //打印出了17777 ???? //因为5432 "1" 实际上是L的小写 //结论:表示长整型数据时L一定要大写,当初制定规范时允许long型字面变量使用小写 //本身就是种错误 }
|