《java谜题》(1)作者:JoshuaBloch&NealGafter

作者简介: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型字面变量使用小写
            //本身就是种错误
        }

你可能感兴趣的:(java,C++,c,Google,C#)