Java取余运算符陷阱与奇数判断

4星 · 超过85%的资源 需积分: 0 3 下载量 188 浏览量 更新于2024-07-27 收藏 831KB DOC 举报
"Java解惑文档提供了关于Java编程中的一些常见问题和陷阱的解析,主要讨论了两个谜题,涉及到了Java中的取余操作符(%)的行为和位操作符(&)的应用。" 在Java编程中,理解语言的底层机制至关重要,尤其是在处理数学运算和逻辑判断时。谜题1关注的是`isOdd`方法,该方法用于判断一个整数是否为奇数。通常,我们使用`i % 2 == 1`来检查一个数是否为奇数,因为当一个数除以2的余数为1时,它就是奇数。然而,这种方法在处理负数时会出现问题,因为在Java中,取余操作符 `%` 对于负数的结果保持了与被除数相同的符号,所以负奇数除以2的余数是-1而不是1。因此,`isOdd`方法在处理负奇数时会错误地返回`false`。 为了解决这个问题,我们可以修改`isOdd`方法,使其不依赖于余数的具体值,而是检查余数是否不等于0。修改后的代码如下: ```java public static boolean isOdd(int i) { return i % 2 != 0; } ``` 此外,为了提高性能,特别是在性能关键的环境中,可以使用位操作符`&`来代替取余操作符。因为`i & 1`会返回`i`的最低位,奇数的二进制表示的末位总是1,偶数则是0,所以`i & 1`也可以有效地判断奇偶性: ```java public static boolean isOdd(int i) { return (i & 1) != 0; } ``` 谜题2涉及到找零问题,虽然不是Java语法层面的问题,但它提示我们在编程时需要考虑实际应用的上下文。在这个例子中,Tom用一张两美元的钞票支付1.10美元的商品,找零应该是0.90美元。这提醒我们在编写处理货币计算的代码时,要确保精度和货币规则的正确性,通常我们会使用`BigDecimal`类来处理货币计算以避免浮点数运算的精度问题。 Java解惑文档旨在帮助开发者理解Java语言的微妙之处,通过这两个谜题,我们学习到了取余操作符的特殊行为以及如何利用位操作符优化代码。在日常开发中,深入理解这些细节可以帮助我们编写出更健壮、高效的代码。