Java谜题.txt
需积分: 0 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` 类来确保精度。
在面试或实际开发中,理解这些概念对于编写正确、可靠的代码至关重要,特别是在性能敏感的环境中,选择正确的数据类型和运算符能够显著影响程序的正确性和效率。对于华为这样的大型企业,对这些问题的理解和掌握是开发者的基本技能要求。在日常编码中,应始终注意边界条件和潜在的精度问题,进行充分的测试,以确保代码的健壮性和准确性。
null1null
- 粉丝: 46
- 资源: 23
最新资源
- 建筑工程消防验收现场评定表.docx
- 交叉检查记录表(急救分中心).doc
- 交叉检查记录表(社区服务中心和乡镇卫生院).doc
- 居家适老化改造补贴实施细则产品功能表.docx
- 井田勘探探矿权出让收益评估报告( 模板).doc
- 髋关节功能丧失程度评定表.docx
- 买断式回购应急确认对话报价申请单.docx
- 每月质量安全调度会议纪要.docx
- 每月电梯安全调度会议纪要.docx
- 每周电梯质量安全排查报告.docx
- 每周电梯安全排查报告.docx
- 每月质量安全调度会议纪要表.docx
- 排水管网情况表.docx
- 聘请服务审批表(表格模板).docx
- 培训班次计划表.doc
- 密闭式输液表格、注意事项.docx