福建医科大学论坛

 找回密码
 注册(开放注册)
搜索
查看: 2065|回复: 1

[计算机类] Java解惑

[复制链接]
发表于 2006-11-29 08:46:11 | 显示全部楼层 |阅读模式
最近无意中看到一本有趣的Java书,《Java解惑》。书中用很多小例子展示了Java编程中的一些少见的陷阱和误区。建议学习Java基础的同学可以好好看看这本书。
     举一个书中最简单的例子,其实以前很多同学就问过这个问题,当时已经逐个解释。又碰到这个问题的同学可以看看。
     以下程序运行结果是多少。
  
class Testdouble{
public static void main(String[] args) {
  System.out.println(0.3 - 0.1);
}
}
  
大家一看可能觉得是0.2,这太简单了!
实际上答案是
0.19999999999999998
这是为什么呢,取决于java中小数的存储方式,其实除了java语言,其他语言也有类似问题。
大部分小数在计算机中是不精确的。下面引用一片文章:

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
    java中的浮点数采用的事IEEE Standard 754 Floating Point Numbers标准,该标准的规范可以参考http://blog.csdn.net/treeroot/articles/94752.aspx.
      float占用4个字节,和int是一样,也就是32bit.
      第1个bit表示符号,0表示正数,1表示负数,这个很好理解,不用多管.
      第2-9个bit表示指数,一共8为(可以表示0-255),这里的底数是2,为了同时表示正数和负数,这里要减去127的偏移量.这样的话范围就是(-127到128),另外全0和全1作为特殊处理,所以直接表示-126到127.
     剩下的23位表示小数部分,这里23位表示了24位的数字,因为有一个默认的前导1(只有二进制才有这个特性).
     最后结果是-1)^(sign) * 1.f * 2^(exponent)
     这里:sign是符号位,f是23bit的小数部分,exponent是指数部分,最后表示范围是(因为正负数是对称的,这里只关心正数)
    2^(-126) ~~ 2(1-2^(-24)) * 2^127
    这个还不是float的取值范围,因为标准中还规定了非规格化表示法,另外还有一些特殊规定.
   
非规格化表示:
    当指数部分全0而且小数部分不全0时表示的是非规格化的浮点数,因为这里默认没有前导1,而是0.
    取值位0.f * 2^(-126),表示范围位 2^(-149)~~ (1-2^(-23)) * 2^(-126) 这里没有考虑符号.这里为什么是-126而不是-127  如果是-127的话,那么最大表示为 2^(-127)-2^(-149),很显然2^(-127) ~~2^(-126) 就没法表示了.


其他特殊表示
    1.当指数部分和小数部分全为0时,表示0值,有+0和-0之分(符号位决定),0x00000000表示正0,0x80000000表示负0.
    2.指数部分全1,小数部分全0时,表示无穷大,有正无穷和负无穷,0x7f800000表示正无穷,0xff800000表示负无穷.
    3.指数部分全1,小数部分不全0时,表示NaN,分为QNaN和SNaN,Java中都是NaN.

结论:
    可以看出浮点数的取值范围是:2^(-149)~~(2-2^(-23))*2^127,也就是Float.MIN_VALUE和Float.MAX_VALUE.


。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
  
上面文章说的float型,对于double型是类似的情况。
换句话说,
0.5 在计算机中可以用2进制精确表示,因为它等于1/2
但是0.1 就不能精确表示了,只能用1/16+1/32+....来逼近,
所以大多数小数是不精确的。
  
某些需要高精度运算的场合可以用BigDecimal。
发表于 2006-12-12 05:59:42 | 显示全部楼层

哦 谢谢啊

您需要登录后才可以回帖 登录 | 注册(开放注册)

本版积分规则

手机访问本页请
扫描左边二维码
         本网站声明
本网站所有内容为网友上传,若存在版权问题或是相关责任请联系站长!
站长联系QQ:7123767   myubbs.com
         站长微信:7123767
请扫描右边二维码
www.myubbs.com

小黑屋|手机版|Archiver|福建医科大学论坛 ( 琼ICP备10001196号-2 )

GMT+8, 2024-3-29 16:29 , Processed in 0.111994 second(s), 15 queries .

Powered by 高考信息网 X3.3

© 2001-2013 大学排名

快速回复 返回顶部 返回列表