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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 程振 中级黑马   /  2012-9-19 21:00  /  1503 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

double是用二进制浮点数表示的,但是还是不理解下面的问题:应该输出0.90才对啊?

  1. public class Change {
  2.         public static void main(String[] args) {
  3.                 System.out.println(2.00-1.10);
  4.                 // 输出是0.8999999999999999
  5.         }
  6. }
复制代码

评分

参与人数 1黑马币 +30 收起 理由
王德升 + 30 去上面通道把名字改下谢谢!

查看全部评分

2 个回复

倒序浏览
double 在计算机里是以 近似值存储的
  所以最后结果是近似值
回复 使用道具 举报
浮点数的误差问题,说起来有些复杂,主要是跟浮点数数在计算机中特殊表示形式有关,
        浮点数是用来表示实数的一种方法,它用 M(尾数) * B( 基数)的E(指数)次方来表示实数,相对于定点数来说,在长度一定的情况下,具有表示数据范围大的特点。但同时也存在误差问题.浮点数有多种实现方法,计算机中浮点数的实现大都遵从 IEEE754 标准,IEEE754 规定了单精度浮点数和双精度浮点数两种规格,单精度浮点数用4字节(32bit)表示浮点数,格式是:1位符号位 8位表示指数 23位表示尾数    双精度浮点数8字节(64bit)表示实数,格式是:1位符号位 11位表示指数 52位表示尾数
      
  采用IEEE754标准的计算机浮点数,在内部是用二进制表示的,但在将一个十进制数转换为二进制浮点数时,会造成误差,原因是不是所有的数都能转换成有限长度的二进制数。对于131072.32 这个数,其有效数字是8位,按理应该能用单精度浮点数准确表示,为什么会出现偏差呢?看一下这个数据二进制尾数就明白了 10000000000000000001010001......     显然,其尾数超过了24bit,根据舍入规则,尾数只取 100000000000000000010100,结果就造成测试中遇到的“奇怪”现象!131072.68 用单精度浮点数表示变成 131072.69 ,原因与此类似。实际上有效数字小于8位的数,浮点数也不一定能精确表示,7.22这个数的尾数就无法用24bit二进制表示,当然表示数值不会有问题(舍入以后还是7.22),但如果参与一些计算,误差积累后,就可能产生较大的偏差。

评分

参与人数 1黑马币 +2 收起 理由
程振 + 2 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马