Java 中Double的疑问

double是64为这个无争议
也就是说double最多能表示2^64个数字! 这句话对吧??!
0.1和0.2和0.3是三个不同的数把!就需要占2^64个中的三个了吧!
那double最大正数1.7976931348623157E308 小数咱先不说
光说1E308吧!就是1X10^308把!这都几位了???
还有小数部分!早就超出位数了啊!

你的理解是错误的,double型是64位,但是表示方法和整数是不一样的。你用整数的想法去理解浮点数,肯定会出错啦。给你看下我做过的笔记,你理解下:
存储布局就是一个浮点数在内存中如何表示.我们知道浮点数有float和double,前者是4个字节也就是32位,后者是8个字节也就是64位.布局分别为:

  符号 指数 小数部分 偏移附加(bias)
  单精度 1[31] 8[30-23] 23[22-00] 127
  双精度 1[63] 11[62-52] 52[51-00] 1023

  中括号内为位的编号范围,外面为该部分所占有的位的数量.偏移附加不属于位表示的内容,是一个常量,稍后解释.
  符号只有一位:0-表示正数 1-表示负数
  指数部分:用指数部分的值(8位/11位,unsigned)的值 减去 偏移附加 得到该数实际的指数 例如值为200,实际指数为73=200-127.对于双精度的double来说常量bias=1023
  尾数:尾数是什么?对于一个科学计数法来讲,形式象这样的 L.M×BE,那么这个L.M就是所谓的尾数(mantisa).它由一个起始位和一个小数部分组成.
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-08-29
看看计算机基础吧
用double计算会造成精度丢失的,而float不会出现这种情况的原因是由于它在计算机种的表示
方式是科学表示法。
如果不懂科学表示法,可以去google搜索下。

一般解决double出现精度问题的方法,是使用BigDecimal来代替Double计算,银行系统的数据计算都是采用BigDecimal。
如果不知道BigDecimal可以goole一下,了解一下

我只告诉了你的解决方法,具体怎么解决你自己看着办,通过解决这些问题,可以提高你解决问题的能力以及你对搜索引擎的使用。这些能力是技术人员必须的
追问

1.7976931348623157E308是不是1.7976931348623157X10^308 这不是后面没有小数点吗?
10的308次幂 好大的数啊! -10^308~+10^308这些范围内的说他都能表示????????

第2个回答  2011-08-29
计算机存储的都是二进制的,也就是说把一个十进制的数换成二进制后,如果它有64位数以上,那么就不能用double,如果少于64位就可以追问

那double最大数是10进制的308次幂!怎么搞的

追答

有的小数是不能换成合适的二进制的,像是十进制的1.1换成二进制就无限了,

第3个回答  2011-08-29
说简单一点。
double是“浮点数”。小数点在不同的位置表现的精度也不一样。
在表现绝对值极大的数值时,每个bit代表的绝对值也非常大。
(浮点段上的值大,每个bit代表的值要乘以2的浮点值次方,所以大)
在表现绝对值极小的数值时,每个bit代表的绝对值也非常小。
(浮点段上的值小,每个bit代表的值要乘以2的浮点值次方,所以小)
并不是每个数值都有精确表达。
14位以上有效数字就难以精确,20位基本上就区分不了
比如0.12345678901234567890和0.12345678901234567891
都会等于同一个值0.12345678901234568
第4个回答  2011-08-29
浮点数在计算机中的表示方法和你想的是不一样的,你可以在网上搜索一下,当让也可以看看IEEE754规范。