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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© jttsai 山林野马   /  2013-10-30 13:08  /  1563 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

先上简单代码:
public class Demo {

        public static void main(String[] args) {
               
                double x = 0.9;
                double y = 0.8;
                double z = x + y;
                System.out.println(z);

        }

}

输出结果为:1.7000000000000002

为什么会出现精度的问题?原因是什么?

我在《Effective   Java》这本书中也提到这个原则,float和double只能用来做科学计算或者是工程计算,在商业计算中我们要用 java.math.BigDecimal。
但我始终不明白相加的出现的原理是什么??

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

4 个回复

倒序浏览
  1. /*
  2. 这是由于double数据类型的有效位所决定的,
  3. 如果楼主想要只保留其有效的运算位,那
  4. 将其结果强转成float即可:
  5. 以下已经帮你做了注释:

  6. */

  7. class DoubleQuestion
  8. {
  9.         public static void main(String[] args)
  10.                 {
  11.                
  12.                 double x = 0.9;
  13.                 double y = 0.8;
  14.                 double z = x + y;
  15.                 System.out.println((float)z);//将结果强转成float数据类型即可

  16.         }
  17. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 瓶中人 于 2013-10-31 22:14 编辑

没有什么原理,这就是双精度的漏洞而已,转换为单精度就可以了,不过没有必要就是,有一一点差错是正常的,用BigDecimal应该就是这个漏洞对应的方法,它的精度比双精度要高。
回复 使用道具 举报
楼主可将输出语句转换为单精度
public class Demo {

        public static void main(String[] args){
                double x = 0.9;
                double y = 0.8;
                double z = x + y;
               System.out.println((float)z);
                                }
}
回复 使用道具 举报
加油哈,好好努力,为了黑马
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马