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编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |