A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 段玉磊 初级黑马   /  2012-7-27 22:53  /  1495 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 段玉磊 于 2012-7-27 22:56 编辑



1.  public static void main(String[] args) {
    double rel = 2.0 - 1.9;
    System.out.println(rel);
    }
  
                                       [size=11.000000pt]   
               
答案是:  0.10000000000000009  为什么最后数字是一个9?

2.

  1. public static void main(String[] args) {
  2.     double b = 2.0 - 1.1;
  3.     System.out.println( b );
  4. }
复制代码
答案是 : 0.8999999999999999   为什么?  为什么不等于 0.9 ?  精度是如何损失的?


评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
本帖最后由 聂峰 于 2012-7-28 09:02 编辑

Java中的简单浮点数类型float和double不能够进行运算。不光是Java,在其它很多编程语言中也有这样的问题。在大多数情况下,计算的结果是准确的,但是多试几次(可以做一个循环)就可以试出类似上面的错误。
Java中,浮点类型是依据IEEE754标准的。IEEE754定义了32位和64位双精度两种浮点二进制小数标准。采用二进制表示double,float等浮点数是不准确的。
回复 使用道具 举报
这种状况是因为二进制存储浮点数的原因所造成的
回复 使用道具 举报
很多小数 计算机无法准确表示的.
比如0.1, 用二进制表示是0.00011001100110011.....
  0.2 用二进制表示是0.00110011001100110.....
  0.3 用二进制表示是0.01001100110011001.....
  0.4 用二进制表示是0.01100110011001100.....
  0.5 用二进制表示是0.1
计算机给分配的存储空间是有限的,double是8字节。所以没有办法精准表示。造成上述问题。
回复 使用道具 举报
本帖最后由 水木桶 于 2012-7-28 09:22 编辑

double,双精度型,在进行运算时,2、1.9并不是我们直观的算的,而是先转换为二进制。
如 2:10;
1.9:1.1110011001100110…… (注意,1.9在转换成二进制的时候,是无法精度无丢失的得到二进制)
具体转换方法:
1.9,整数、小数分别转换
1:1;
0.9:
0.9*2=1.8 取1,余0.8
0.8*2=1.6 取1,余0.6
0.6*2=1.2 取1,余0.2
0.2*2=0.4 取0,余0.4
0.4*2=0.8 取0,余0.8
0.8*2=1.6 取1,余0.6
……
(可以看出,循环了)
然后,它们进行相关运算,得到的结果就只会无限趋近于0.1这个值。
1、2两题都是这个道理。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马