现在的位置: 首页 > 综合 > 正文

自编java细节(3)—-之你不可能得到正确的结果

2018年05月10日 ⁄ 综合 ⁄ 共 792字 ⁄ 字号 评论关闭

我很高兴这一刻我又有了新的进展,又找到了新的好玩的东西,
先来看看下面的一段程序
public static boolean isOdd(int i){


       return i % 2 == 1;


}

你可否会考虑一下上面的方法是否总是正确,它是否会得到意想不到的结果呢??如果你认为它是正确的话,那么你的答案和我一开始的答案一样,我的初衷也是正确的,但是既然在这里摆上了一个这样的问题,那么总能说明的一个问题就是它是不正确的,但是到底是为什么呢?还要追寻到java的一个小小的细节问题上。
是的问题的根源都在这里:
这是关于java中'%'操作符的一个传说,在java中它被定义为任何时候都会满足以下的式子:
其中a是任何整数,b是任何非零整数。
(a/b)*b + (a%b) == a  ----这个式子在java的%运算中,被定义为总是返回true
这看起来可能最初并没有什么问题,但是%运算符还有另一个特性就是 它运算的结果和被除数的符号是一样的,
所以现在上面的方法的错误之处就显而易见了,当被除数是负数的时候,这个方法返回的都是-1,而不是1,所以这也是设计不到位的问题,
所以最后的结果就是在用上面的方法进行判断的时候,只要被除数是负数的情况,该方法总返回false,在被除数是正数的情况下,它有1/2的概率会返回false,所以该方法在3/4的情况下返回的都是false,这显然不是正确的。
所以要在判断的时候 时刻关注 %运算结果的符号问题, 现在我需要对上面的方法进行改装

public static boolean idOdd(int i){
   
     return a%b != 0;
}

所以以后再写方法的时候一定要准确测试你的方法在参数是整数负数或者是0的时候是否可以正确表达语义。
如果你在一个性能临界的环境中编写方法的时候可以使用这个方法

public static boolean idOdd(int i){
return (a & b) != 0;
}

最后祝福大家中秋快乐

抱歉!评论已关闭.