黑马程序员技术交流社区
标题:
java中的陷阱题
[打印本页]
作者:
ApePlanet
时间:
2017-3-3 07:22
标题:
java中的陷阱题
以下是本人在做题中遇到的疑问,然后通过强大的引擎解决后,赶紧总结出来,给新手们做个参考,不喜欢的勿喷
1、找奇数:
public static boolean isOdd(int i){
return i % 2 == 1;
}
上面的方法真的能找到所有的奇数么?
A:没有考虑到负数问题,如果i为负则不正确。应该return i%2 == 0
2. 浮点数相减
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的,可以使用
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. 无限循环
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就可以解决问题。
4. 到底返回什么?
public static boolean decision() {
try {
return true;
} finally {
return false;
}
}
A:返回false。此时return true是不可达语句,在编译阶段将优化去掉。
如果还有其他欢迎补充。
作者:
fuleigang
时间:
2017-3-3 07:44
昨天考试了
作者:
首尔街少年
时间:
2017-3-3 08:21
加油!!!!!好难 现在每天
作者:
烟雨清寒时
时间:
2017-3-3 08:54
感谢楼主分享
作者:
黑色旋涡
时间:
2017-3-3 10:16
感谢楼主分享
作者:
lvshen9
时间:
2017-3-3 12:14
谢谢分享
作者:
首尔街少年
时间:
2017-3-3 18:09
加油!!!!!
作者:
shaojing123
时间:
2017-3-3 21:20
加油一起努力。
作者:
Devirn
时间:
2017-3-3 23:16
可以,还不错
作者:
Devirn
时间:
2017-3-3 23:17
还行吧,加油啦
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2