快速业务通道

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

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

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

时间:2010-12-22 IBM Brian Goetz

许多程序员在其整个开发生涯中都不曾使用定点或浮点数,可能的例外是, 偶尔在计时测试或基准测试程序中会用到。Java语言和类库支持两类非整数类型 ― IEEE 754 浮点( float 和 double ,包装类(wrapper class)为 Float 和 Double ),以及任意精度的小数( java.math.BigDecimal )。在本月的 Java 理论和实践中,Brian Goetz 探讨了在 Java 程序中使用非整数类型时一 些常碰到的陷阱和“gotcha”。

虽然几乎每种处理器和编程语言都支持浮点运算,但大多数程序员很少注意 它。这容易理解 ― 我们中大多数很少需要使用非整数类型。除了科学计算和偶 尔的计时测试或基准测试程序,其它情况下几乎都用不着它。同样,大多数开发 人员也容易忽略 java.math.BigDecimal 所提供的任意精度的小数 ― 大多数应 用程序不使用它们。然而,在以整数为主的程序中有时确实会出人意料地需要表 示非整型数据。例如,JDBC 使用 BigDecimal 作为 SQL DECIMAL 列的首选互换 格式。

IEEE 浮点

Java 语言支持两种基本的浮点类型: float 和 double ,以及与它们对应 的包装类 Float 和 Double。它们都依据 IEEE 754 标准,该标准为 32 位浮点 和 64 位双精度浮点二进制小数定义了二进制标准。

IEEE 754 用科学记数法以底数为 2 的小数来表示浮点数。IEEE 浮点数用 1 位表示数字的符号,用 8 位来表示指数,用 23 位来表示尾数,即小数部分。 作为有符号整数的指数可以有正负之分。小数部分用二进制(底数 2)小数来表 示,这意味着最高位对应着值 ?(2 -1),第二位对应着 ?(2 -2),依此类推。对 于双精度浮点数,用 11 位表示指数,52 位表示尾数。IEEE 浮点值的格式如图 1 所示。

图 1. IEEE 754 浮点数的格式

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

因为用科学记数法可以有多种方式来表示给定数字,所以要规范化浮点数, 以便用底数为 2 并且小数点左边为 1 的小数来表示,按照需要调节指数就可以 得到所需的数字。所以,例如,数 1.25 可以表示为尾数为 1.01,指数为 0: (-1) 0*1.01 2*2 0

数 10.0 可以表示为尾数为 1.01,指数为 3: (-1) 0*1.01 2*2 3

特殊数字

除了编码所允许的值的标准范围(对于 float ,从 1.4e-45 到 3.4028235e+38),还有一些表示无穷大、负无穷大、 -0 和 NaN(它代表“不 是一个数字”)的特殊值。这些值的存在是为了在出现错误条件(譬如算术溢出 ,给负数开平方根,除以 0 等)下,可以用浮点值集合中的数字来表示所产生 的结果。

这些特殊的数字有一些不寻常的特征。例如, 0 和 -0 是不同值,但在比较 它们是否相等时,被认为是相等的。用一个非零数去除以无穷大的数,结果等于 0。特殊数字 NaN 是无序的;使用 == 、 < 和 > 运算符将 NaN 与其它 浮点值比较时,结果为 false。如果 f 为 NaN,则即使 (f == f) 也会得到 false。如果想将浮点值与 NaN 进行比较,则使用 Float.isNaN() 方法。表 1 显示了无穷大和 NaN 的一些属性。

表 1. 特殊浮点值的属性

表达式 结果
Math.sqrt(-1.0) -> NaN
0.0 / 0.0 -> NaN
1.0 / 0.0 -> 无穷大
-1.0 / 0.0 -> 负无穷大
NaN + 1.0 -> NaN
无穷大 + 1.0 -> 无穷大
无穷大 + 无穷大 -> 无穷大
NaN > 1.0 -> false
NaN == 1.0 -> false
NaN < 1.0 -> false
NaN == NaN -> false
0.0 == -0.01 -> true

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号