`
yuwei2008vip
  • 浏览: 38679 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

谜题2:找零时刻

阅读更多
下面是一个试图解决上述问题的程序,它会打印出什么呢?
public class Change
{
	public static void main(String args[])
	{
		System.out.println(2.00 - 1.10);
	}
}

运行该程序打印的是:0.8999999999999999,问题在于并不是所有的小数都可以用二进制浮点数来精确表示的。

Double.toString文档中所设定的将double类型的值转换为字符串的规则:是足以将double类型的值与最靠近它的临近值区分出来的最短小数,它在小数点之前和之后都至少有一位。

如果正在使用的是JDK 5.0 或更新的版本,
//拙劣的解决方案——仍旧是使用二进制浮点数
System.out.printf("%.2f%n",2.00 - 1.10);

这条语句打印的是正确的结果,但是这并不表示对底层问题的通用解决方案:它使用的仍旧是二进制浮点数的double运算。浮点运算在一个范围很广的值域上提供了很好的近似,但是它通常不能产生精确的结果。

BigDecimal,它可以通过JDBC与SQL DECIMAL类型进行互操作。
警告:一定要用BigDecimal(String)构造器,而千万不要用BigDecimal(double),后一个构造器将用它的参数的“精确”值来创建一个实例。
import java.math.BigDecimal;
public class Change1
{
	public static void main(String args[])
	{
		System.out.println(new BigDecimal("2.00").
		subtract(new BigDecimal("1.10")));
	}
}


总之:在需要精确答案的地方,要避免使用float和double;对于货币计算,要使用int、long、BigDecimal。
分享到:
评论

相关推荐

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

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

    Java谜题Java谜题1——表达式谜题

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

    iava解惑,深入剖析java

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

    java 解惑.pdf

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

    java解惑95个谜题.doc

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

    Java解惑.zip

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

    java 谜题95

    #### 谜题2:找零时刻 **题目解析** 这个谜题涉及到了二进制浮点数表示精度问题。题目描述了一个简单的找零场景:用户用2美元支付一个价值1.10美元的商品,程序应该计算找零金额。初始代码如下: ```java public ...

    java解惑

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

    Java解惑 共95个疑惑点

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

    JAVA面试谜题解惑.pdf

    #### 找零时刻谜题:浮点数运算的陷阱 **题目背景:** 本题旨在考察面试者对Java中浮点数运算的理解,特别是对于浮点数表示不精确性的认识。 **题目描述:** 题目给出了一段代码,用于模拟一个简单的找零场景。...

    java解惑 中文版

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

    JAVA解惑.doc

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

    Java 解惑

    #### 二、找零时刻:二进制浮点数的局限性 **谜题背景** 在实际应用中,经常需要处理货币相关的计算,例如找零。下面的例子展示了在使用Java的双精度浮点数(`double`)时可能会遇到的问题。 **问题描述** 假设有...

    Java解惑.pdf

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

Global site tag (gtag.js) - Google Analytics