java puzzlers [更新至14.04.03]

解惑1:奇偶性

  奇偶性判断可用&运算代替取余运算:

    偶数:(i & 1) == 0;

    奇数:(i & 1) != 0;

解惑2:找零时刻

System.out.println(2.0 - 1.1);    //输出0.8999999999999999

  二进制浮点不适合货币计算,它不能将0.1或10的其他任何负次幂精确表示为一个有限长度的二进制小数,只能表示为最靠近它的临近值。1.1不能被精确表示为一个double,因此2.0减去1.1的临近值就得到输出结果。

  解决方法可以将小数化为相应的整数进行计算,或者使用Java在java.math包中提供的API类BigDecimal,且必须使用参数类型为String的构造函数,上述代码可表示为:

System.out.println(new BigDecimal("2.0").subtract(new BigDecimal("1.1"))); //输出0.9

解惑3:长整数

long a = 24 * 60 * 60 * 1000 * 1000;
long b = 24L * 60 * 60 * 1000 * 1000;
System.out.println(a);            //输出500654080
System.out.println(b);            //输出86400000000    
System.out.println(Integer.MAX_VALUE);  //输出2147483647
System.out.println(Long.MAX_VALUE);    //输出9223372036854775807

  当操作数字很大时,要提防溢出。如上述代码,a虽然是long类型,但其赋值号右边的运算均以int运算来执行,在运算完成之后才提升为long型,而计算过程中已溢出(整型最大值为2^31-1 = 2147483647)。而b的第一个因子为long型,可使得每一个乘积的第一个因子均为long型,因此可以强制表达式所有后续计算都用long运算,且计算结果不会溢出(长整型最大值为2^63-1 = 9223372036854775807)。

解惑4:初级问题

  注意区分 54321 和 5432l 。后者为long型值为5432,为了区分,在long类型字面值常量中,建议用大写的L表示。

java puzzlers [更新至14.04.03],布布扣,bubuko.com

java puzzlers [更新至14.04.03]

上一篇:初识java——java的基础语法


下一篇:C++实现一个简单的异常日志记录类