`
JiongBull
  • 浏览: 8050 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

解惑2:找零时刻

 
阅读更多

[声明]所有代码均来自Joshua Bloch和Neal Gafter所著的<Java解惑>一书,本人仅因学习需要摘抄和注释,感谢二位作者的知识分享.

 

代码:

 

public class Change {
    public static void main(String args[]) {
        System.out.println(2.00 - 1.10);
    }
}

 

 结果:

 

0.8999999999999999

 

 

分析:

在JAVA中二进制浮点数并不能完全精确的表示小数,我们看到的浮点数的实际值是无限接近字面值的数值.

例如:1.10字面值是1.10,但是这个浮点数在计算机中的实际值可能是1.11111111111.

所以计算的结果可能没达到我们的预期.

所以在计算浮点数运算时通常使用精度更高更准确的BigDecimal类.

 

代码:

 

 

public class Change {
    public static void main(String args[]) {
    	System.out.println(new BigDecimal("2.00").subtract(new BigDecimal("1.10")));
    }
}
 

结果:

 

0.90

 

 注意在实例化BigDecimal时,如果用浮点数做参数来实例化,并不能得到正确结果,因为浮点数的实际值并非预期值.

 

解决方案代码:

 

public class Change {
    public static void main(String args[]) {
    	System.out.println(new BigDecimal(2.00).subtract(new BigDecimal(1.10)));
    }
}

 结果:

 

0.899999999999999911182158029987476766109466552734375
 

 

分享到:
评论

相关推荐

    java 解惑.pdf

    **谜题2:找零时刻** - **描述**:程序意图计算找零所需的最小硬币数量,但结果却不是预期的最优化解。 - **解惑**:该问题的核心在于理解硬币面额的组合方式。在某些情况下,选择最大面额的硬币不一定能得出最少...

    Java解惑.zip

    接下来是“谜题2:找零时刻”。这可能是一个涉及编程逻辑的问题,尤其是在处理货币计算时常见的精度问题。在Java中,使用double或float类型进行货币计算可能会导致精度损失,因为它们使用浮点数表示,而非精确的十...

    Java解惑 共95个疑惑点

    本篇将主要针对“Java解惑”这一主题,探讨其中的两个重要谜题:谜题1 - 奇数性与谜题2 - 找零时刻。这两个问题触及到Java语言的基础知识,包括逻辑运算、类型转换以及数学操作。 首先,我们来看谜题1 - 奇数性。在...

    java解惑 中文版

    - **谜题2**:找零时刻。该谜题涉及到了Java中双精度浮点数(`double` 类型)的精度问题。 - **问题描述**:假设 Tom 在一家汽车配件店购买了一个价值 $1.10 的火花塞,他使用了一张 $2 的钞票进行支付。代码尝试...

    java解惑95个谜题.doc

    谜题2:找零时刻 在这个问题中,Tom用一张2美元的钞票支付1.10美元的商品,我们期望程序能返回0.90美元的找零。然而,当使用`double`类型进行计算时,由于浮点数的二进制表示不精确,结果可能会出现意料之外的误差。...

    java解惑

    **谜题2:找零时刻** 问题在于尝试使用`double`类型进行货币计算,这是一个常见的陷阱。代码如下: ```java public class Change{ public static void main(String args[]){ System.out.println(2.00 - 1.10); ...

    JAVA 解惑(解析JAVA开发中的95个疑惑点)

    **标题**: 找零时刻 **描述**: 本节探讨了在Java中进行浮点数运算时可能遇到的精度问题。 **详细解释**: 在实际应用中,比如财务计算场景,我们需要确保计算结果的准确性。然而,由于浮点数(如 `float` 和 `...

    java解惑 PDF版

    文档中提到的找零时刻问题便是因浮点数精度问题引发的典型案例。在使用`System.out.println(2.00-1.10);`时,期望输出的是0.90,但实际上输出的是0.***。这是因为1.1这个数值无法精确地以double类型表示,计算结果是...

    iava解惑,深入剖析java

    谜题2:找零时刻 此谜题可能涉及到数学运算和类型转换。在Java中,计算找零通常需要计算总金额与支付金额的差值,然后将结果转换为合适的货币单位。需要注意的是,Java中的浮点数运算可能会有精度问题,因此在处理...

    java疑难解惑(提高篇)

    接下来是“找零时刻”的谜题。在计算找零时,使用`double`类型可能会导致精度问题。由于二进制浮点数无法精确表示某些十进制数,如0.1,所以在进行浮点数运算时,可能会得到预期之外的结果。在例子中,`2.00 - 1.10`...

    Java解惑(谜题)CHM中英文双版本

    谜题2:找零时刻 谜题3:长整除 谜题4:初级问题 谜题5:十六进制的趣事 谜题6:多重转型 谜题7:互换内容 谜题8:Dos Equis 谜题9:半斤 谜题10:八两 Java谜题2——字符谜题 谜题11:最后的笑声 谜题12...

    Java解惑.pdf

    #### 找零时刻:浮点数的精度问题 接下来,我们探讨一个涉及货币计算的谜题。假设Tom在购买价值$1.10的商品时,使用了$2.00的纸币,理论上应找回$0.90。然而,在实际编程中,当我们尝试计算这个找零值时,却遇到了...

    JAVA解惑.doc

    #### 二、找零时刻:货币计算的陷阱 **谜题背景** 本谜题探讨了货币计算中的一个常见问题:如何准确地计算找零金额。这个问题涉及到Java中双精度浮点数(`double`类型)的表示和计算精度问题。 **谜题描述** 谜题...

Global site tag (gtag.js) - Google Analytics