一、找奇数: java
public static boolean isOdd(int i){ return i % 2 == 1; }上面的方法真的能找到全部的奇数么?
A:没有考虑到负数问题,若是i为负则不正确。应该return i%2 == 0 编程
System.out.println(2.0-1.9);A:Java中的简单浮点数类型float和double不可以进行运算。不光是Java,在其它不少编程语言中也有这样的问题。在大多数状况下,计算的结果是准确的,可是多试几回(能够作一个循环)就能够试出相似上面的错误。固然加减乘除都有可能有问题,好比:
System.out.println(0.05+0.01); System.out.println(1.0-0.42); System.out.println(4.015*100); System.out.println(123.3/100);
这是由于有些十进制有限位数的小数,到二进制里面可能会变成无限循环小数,在浮点数中不能表示而损伤精度。 编程语言
解决方法: 优化
1. 若是是判断a-b是否等于c,或者a+b是否等于c的,可使用 url
if(0.05+0.01-0.06 < 0.0000001) { }2. 在《Effective Java》这本书中提到一个原则,float和double只能用来作科学计算或者是工程计算,在商业计算中咱们要用 java.math.BigDecimal来解决
System.out.println((new BigDecimal("2.0")).subtract( new BigDecimal("1.9")).doubleValue());
3. 无限循环 spa
public static final int END = Integer.MAX_VALUE; public static final int START = END - 2; public static void main(String[] args) { int count = 0; for (int i = START; i <= END; i++) count++; System.out.println(count); }A:这里无限循环的缘由就是当i为Integer.MAX_VALUE时,此时for循环是先++,而后判断i是否<=END,当i为 Integer.MAX_VALUE再++时,i变成了负数。因此就一直循环下去。
变成负数的缘由就是int溢出了。这里将<=END改为<END就能够解决问题。 .net
4. 到底返回什么? code
public static boolean decision() { try { return true; } finally { return false; } }A:返回false。此时return true是不可达语句,在编译阶段将优化去掉。
若是还有其余欢迎补充。 blog
2. http://zhidao.baidu.com/link?url=0UyDU42L7DXZitdydJMG3IIUDIf3xidFCRAObZAq6SHFCEaNnp2Oyuq1KVwBvmlR0UZGHSjD4f6A1yD0d65JL_ ci
3. http://bbs.csdn.net/topics/300023952
4. http://z466459262.iteye.com/blog/739300