java判断加减结果正确否者_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改成

4. 到底返回什么?

public static boolean decision() {

try {

return true;

} finally {

return false;

}

}

a:返回false。此时return true是不可达语句,在编译阶段将优化去掉。

3、下面来分享一段面试可能会遇到的陷阱题

看代码:

int a=5;

system.out.println("value is"+((a<5)? 10.9:9 ));

输出结果为:

a.编译错误     b10.9     c.9    d 以上答案都不对。

运行执行结果为:

value is9.0

因为((a<5) ? 10.9 )有一个10.9java 根据运算符精度自动转型。因此后面的 9 也会变成9.0 。

所以选d 。

a

stringbuffer str1=new stringbuffer("123");

stringbuffer str2=new stringbuffer("123");

if(str1.equals(str2)){

system.out.println("str1.equalstr2");

}else{

system.out.println("str1.notequalstr2");

}

结果为: str1.notequalsstr2这说明stringbuffer 没有重写 equals 方法。

float fa=new float(0.9f);

float fb=new float(0.9f); //float fb=new float("0.9f");

double db=new double(0.9f);

if(fa==fb){ //false

system.out.println("fa==fb");

}else{

system.out.println("fa!=fb");

}

if(fa.equals(fb)){ //true

system.out.println("fa.equalfb");

}else{

system.out.println("fa!equalfb");

}

if(db.equals(fb)){ //false

system.out.println("db.equalfb");

}else{

system.out.println("db!equalfb");

}

结果为:

fa!=fb

fa.equalfb

db!equalfb float 型与double 型肯定不相等

如果还有其他欢迎补充。

reference:

1. http://blog.csdn.net/ol_beta/article/details/5598867

2. http://zhidao.baidu.com/link?url=0uydu42l7dxzitdydjmg3iiudif3xidfcraobzaq6shfceannp2oyuq1kvwbvmlr0uzghsjd4f6a1yd0d65jl_

3. http://bbs.csdn.net/topics/300023952

4. http://z466459262.iteye.com/blog/739300

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

希望与广大网友互动??

点此进行留言吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值