JAVA解惑之奇数性
有一段时间没写过东西了,由于各种状况。今晚就抽些时间来更新一篇。
如题所示,这次要讨论的是JAVA中关于判断一个数(这里以int为例)是否为奇数的问题。
首先看以下的代码:
boolean isOddBy1(int i) { return i % 2 == 1; }
当使用0、1、2……等测试时,结果符合期望。这样看起来以上的代码是没错的。的确,在一定程度上来说这个方法具有正确性,但只局限于非负整数,当使用负奇数测试时,会发现结果不符合期望。例如-3的时候会返回false,即判断结果为不是奇数。 稍微有些数学基础的人都明白,负数求余返回的值也是负数。而Java 对取余操作符(%)的定义所产生的后果。该操作符被定义为对于所有的 int 数值 a 和所有的非零 int 数值 b,都满足下面的恒等式:
(a / b) * b + (a % b) == a
换句话说,如果你用b整除a,将商乘以b,然后加上余数,那么你就得到了最初的值 a 。该恒等式具有正确的含义,但是当与 Java 的截尾整数整除操作符相结合时,它就意味着:当取余操作返回一个非零的结果时,它与左操作数具有相同的正负符号。 当i为负奇数时,其余数为-1,因此上面的方法将返回false。
这个问题很容易解决,只需与0作判断即可,见下面的代码:
boolean isOddBy0(int i) { return i % 2 != 0; }
然后测试正负整数和零都能返回期望值。 这个问题看起来很低级,但也是容易犯的错误之一,所以不得不注意。 其实这个问题是出自于《JAVA解惑》,我只是为了加强记忆而操作一遍并以文章的形式发出来。或者你会觉得这有些多余,但脚踏实地也是提高编程能力的关键。
曾经初中的一位老师对我说过,“你像一匹老马,脚踏实地,一步一步向前走”。从今以后我也会继续保持这样的步伐不断迈进。