Java解惑--一本很好的java书籍

preview
需积分: 0 7 下载量 29 浏览量 更新于2010-06-23 收藏 562KB DOC 举报
在Java编程中,理解语言的细节至关重要,尤其是在处理特定操作如取余运算和浮点数计算时。本文将深入探讨两个常见的Java谜题,这些谜题涉及到了Java中的取余运算符 `%` 和浮点数表示的不精确性。 我们来看第一个谜题,关于判断奇数性的方法。在Java中,使用`i % 2 == 1`来检查一个整数`i`是否为奇数,初看之下似乎没有问题,因为取余运算符 `%` 可以得到整除后的余数。然而,当`i`是负数时,`i % 2`的结果会是-1而不是1,导致负奇数被误判为偶数。这是由于Java的取余运算符遵循的数学恒等式 `(a / b) * b + (a % b) == a`,在整数除法时,负数的取余结果保持了负数的符号。为了解决这个问题,我们可以修改判断条件为 `i % 2 != 0`,这样无论正负,只要余数不等于0,就说明是奇数。如果在性能至关重要的场景下,还可以使用位操作符 `&` 来替代取余运算,如 `return (i & 1) != 0;`,这种方法效率更高。 第二个谜题涉及浮点数的精度问题。在Java中,`double`类型的数值是用二进制浮点数表示的,这意味着某些十进制小数无法精确表示。例如,1.1在二进制中是一个无限循环小数,因此在计算机内存中存储的实际上是1.1的一个近似值。当我们尝试计算 `2.00 - 1.10` 时,实际上是在进行两个近似值的减法运算,结果可能会产生意想不到的精度误差。例如,上述代码实际输出可能是 `0.8999999999999999`,而不是期望的 `0.90`。要解决这个问题,我们不能单纯依赖浮点数运算,尤其是对于货币计算这样的应用,因为二进制浮点数的不精确性可能导致财务数据的错误。一种可行的解决方案是使用整数类型(如 `int` 或 `long`)来存储和计算金额,或者使用Java 5.0以后引入的 `BigDecimal` 类,它可以提供任意精度的十进制运算。 在编写Java代码时,特别是在处理数学运算和数值类型时,我们需要对Java的运算符行为和数据类型有深入的理解。对于取余运算,要注意负数的情况;对于浮点数,要意识到它们的精度限制,并在必要时使用更精确的数据类型或算法来避免误差。这些知识对于提升Java编程的质量和可靠性至关重要。
koper
  • 粉丝: 0
  • 资源: 1
上传资源 快速赚钱
voice
center-task 前往需求广场,查看用户热搜

最新资源