当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:14:00  来源:本站整理

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

赞助商链接



  本文“Java理论与实践: 您的小数点到哪里去了?[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

很多程序员在其整个开辟生涯中都不曾利用定点或浮点数,大概的例外是, 无意在计时测试或基准测试程序中会用到.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 浮点数的格局

因为用科学记数法可以有多种方法来表示给定数字,所以要标准化浮点数, 以便用底数为 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

基本浮点范例和包装类浮点有差别的对比行为

使事情更糟的是,在基本 float 范例和包装类 Float 之间,用于对比 NaN 和 -0 的法则是差别的.关于 float 值,对比两个 NaN 值能否相等将会得到 false ,而利用 Float.equals() 来对比两个 NaN Float 对象会得到 true.造 成这种现象的缘由是,假如不这样的话,就不大概将 NaN Float 对象用作 HashMap 中的键.近似的,固然 0 和 -0 在表示为浮点值时,被认为是相等的 ,但利用 Float.compareTo() 来对比作为 Float 对象的 0 和 -0 时,会显示 -0 小于 0.


  以上是“Java理论与实践: 您的小数点到哪里去了?[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • 利用Javascript实现网页水印(非图片水印)
  • Java开辟环境的搭建
  • Ubuntu java安装与配置
  • 办理Ubuntu 10.04 Firefox3.6 Java浏览器插件不工作的问
  • Ubuntu重装后Java环境的设置
  • Sun Java进入Ubuntu 10.10软件中央
  • Ubuntu 10.10配置Java开辟环境
  • 在Ubuntu 10.10中配置Java环境变量的办法
  • Ubuntu下Java环境的搭建
  • Ubuntu 10.04 下安装 Java, JRE
  • Ubuntu 10.04下的搭建SUN JAVA开辟环境
  • Ubuntu 12.04安装java7
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .