快速业务通道

Java理论与实践: 您的小数点到哪里去了? - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22
的值的范围。

清单 1. 需要非负浮点值的较好办法和较差办法

// Trying to test by exclusion -- this doesn''t catch NaN or infinity    public void setFoo(float foo) {     if (foo < 0)       throw new IllegalArgumentException(Float.toString (f));      this.foo = foo;    }    // Testing by inclusion -- this does catch NaN    public void setFoo(float foo) {     if (foo >= 0 && foo < Float.INFINITY)      this.foo = foo;   else      throw new IllegalArgumentException(Float.toString(f));    }

Java理论与实践: 您的小数点到哪里去了?(3)

时间:2010-12-22 IBM Brian Goetz

不要用浮点值表示精确值

一些非整数值(如几美元和几美分这样的小数)需要很精确。浮点数不是精 确值,所以使用它们会导致舍入误差。因此,使用浮点数来试图表示象货币量这 样的精确数量不是一个好的想法。使用浮点数来进行美元和美分计算会得到灾难 性的后果。浮点数最好用来表示象测量值这类数值,这类值从一开始就不怎么精 确。

用于较小数的 BigDecimal

从 JDK 1.3 起,Java 开发人员就有了另一种数值表示法来表示非整数: BigDecimal。BigDecimal 是标准的类,在编译器中不需要特殊支持,它可以表 示任意精度的小数,并对它们进行计算。在内部,可以用任意精度任何范围的值 和一个换算因子来表示 BigDecimal ,换算因子表示左移小数点多少位,从而得 到所期望范围内的值。因此,用 BigDecimal 表示的数的形式为 unscaledValue*10 -scale。

用于加、减、乘和除的方法给 BigDecimal 值提供了算术运算。由于 BigDecimal 对象是不可变的,这些方法中的每一个都会产生新的 BigDecimal 对象。因此,因为创建对象的开销, BigDecimal 不适合于大量的数学计算,但 设计它的目的是用来精确地表示小数。如果您正在寻找一种能精确表示如货币量 这样的数值,则 BigDecimal 可以很好地胜任该任务。

所有的 equals 方法都不能真正测试相等

如浮点类型一样, BigDecimal 也有一些令人奇怪的行为。尤其在使用 equals() 方法来检测数值之间是否相等时要小心。equals() 方法认为,两个表 示同一个数但换算值不同(例如, 100.00 和 100.000 )的 BigDecimal 值是 不相等的。然而, compareTo() 方法会认为这两个数是相等的,所以在从数值 上比较两个 BigDecimal 值时,应该使用 compareTo() 而不是 equals()。

另外还有一些情形,任意精度的小数运算仍不能表示精确结果。例如, 1 除 以 9 会产生无限循环的小数 .111111...。出于这个原因,在进行除法运算时, BigDecimal 可以让您显式地控制舍入。movePointLeft() 方法支持 10 的幂次 方的精确除法。

使用 BigDecimal 作为互换类型

SQL-92 包括 DECIMAL 数据类型,它是用于表示定点小数的精确数字类型, 它可以对小数进行基本的算术运算。一些 SQL 语言喜欢称此类型为 NUMERIC 类 型,其它一些 SQL 语言则引入了 MONEY 数据类型,MONEY 数据类型被定义为小 数点右侧带有两位的小数。

如果希望将数字存储到数据库中的 DECIMAL 字段,或从 DECIMAL 字段检索 值,则如何确保精确地转换该数字?您可能不希望使用由 JDBC PreparedStatement 和 ResultSet 类所提供的 setFloat() 和 getFloat() 方 法,因为浮点数与小数之间的转换可能会丧失精确性。相反,请使用 PreparedStatement 和 ResultSet 的 setBigDecimal() 及 getBigDecimal() 方法。

对于 BigDecimal ,有几个可用的构造函数。其中一个构造函数以双精度浮 点数作为输入,另一个以整数和换算因子作为输入,还有一个以小数的 String 表示作为输入。要小心使用 BigDe

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号