Java谜题.txt

preview
需积分: 0 6 下载量 10 浏览量 更新于2008-04-15 收藏 600KB DOC 举报
谜题1:奇数性<br>下面的方法意图确定它那唯一的参数是否是一个奇数。这个方法能够正确运转吗? <br>public static boolean isOdd(int i){<br> return i % 2 == 1;<br>}<br>奇数可以被定义为被2整除余数为1的整数。表达式 i % 2 计算的是 i 整除 2 时所产生的余数,因此看起来这个程序应该能够正确运转。遗憾的是,它不能;它在四分之一的时间里返回的都是错误的答案。 <br>为什么是四分之一? Java谜题一涉及到的是关于Java中的取余运算符 `%` 的特性和整数类型的奇偶性判断。在Java中,`i % 2 == 1` 的表达式本应判断整数 `i` 是否为奇数,但在处理负数时会出现问题。由于Java的整数除法是向下取整,所以当 `i` 为负奇数时,`i / 2` 会得到一个负的整数,然后 `i % 2` 会得到 `-1` 而非 `1`,导致方法 `isOdd` 返回错误的结果。这个问题可以通过改变比较条件来解决,如 `return i % 2 != 0`,或者使用位操作符 `&` 来提高效率,如 `return (i & 1) != 0`。 谜题二涉及的是浮点数(`double` 类型)在计算和表示上的精度问题。当尝试计算找零金额 `2.00 - 1.10` 时,由于 `1.1` 无法精确表示为二进制浮点数,它会被近似为一个略微小于 `1.1` 的值。因此,`2.00 - 1.10` 的结果不是预期的 `0.9`,而是接近 `0.9` 的一个不精确的浮点数表示。为了解决这个问题,可以使用 `printf` 函数来指定输出的精度,但这并未改变计算过程中的精度损失,只是在显示时进行了格式化。 这两个谜题揭示了Java编程中需要注意的两个关键点: 1. 当处理整数运算时,尤其是涉及取余操作时,要考虑负数的情况,因为取余运算符 `%` 的行为在负数上下文中可能不直观。 2. 浮点数(如 `double` 和 `float`)在进行数学计算时可能会有精度误差,特别是在涉及小数部分的比较和计算时。在需要精确计算或表示小数的情况下,应当谨慎使用浮点数,或者考虑使用 `BigDecimal` 类来确保精度。 在面试或实际开发中,理解这些概念对于编写正确、可靠的代码至关重要,特别是在性能敏感的环境中,选择正确的数据类型和运算符能够显著影响程序的正确性和效率。对于华为这样的大型企业,对这些问题的理解和掌握是开发者的基本技能要求。在日常编码中,应始终注意边界条件和潜在的精度问题,进行充分的测试,以确保代码的健壮性和准确性。