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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© HM李帅 中级黑马   /  2013-3-8 10:24  /  1393 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 mainXbegin 于 2013-3-8 14:53 编辑

public class Test {
        /**
         * @param args
         */
        public static void main(String[] args) {
                System.out.println(2-1.1);
         }
}

输出结果为0.8999999999999999   
为什么不是0.9
产生的原因是什么  怎么解决这种计算

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 鼓励鼓励

查看全部评分

5 个回复

倒序浏览
浮点数以IEEE754标准在计算机中存储,绝大多数的浮点数是无法精确的在计算机中存储的,
就拿1.1来说吧,这个数本身就不能精确的转化为二进制形式,在1.1-1.9之间,只有1.5才可以精确的转化为二进制形式,
1.1的二进制形式是无限循环的,再以IEEE754形式存入计算机的时候,其实真正存储的值是非常接近1.1的一个浮点数,也就是 1.0000000000000001
所以计算机执行 2-1.1 的时候会输出 0.8999999999999999

在计算机中用定点数表示法解决浮点数的无法准确存储问题,也就说,用一个字节的前四位表示整数部分,后四位表示小数部分,把小数点定在中间
当然,如果把1.1+0.05,那这个数就是1.15,1.15是可以在计算机中精确存储的,运算结果后再减去 0.05,这样的方法也行的通

至于为什么 0.05   1.15能准确存储,为什么1.1不能准确存储,为什么1.1的二进制形式是无限循环的,,,我想我没必要在这里解释了。如果这个不了解那就该看看小数的二进制转化方法了

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 赞一个!

查看全部评分

回复 使用道具 举报
终于抢了了沙发 你问的这个问题毕老师曾经在视频里讲过 就是 int double float 他们之间的优先级的问题
你这道题里面,你看这句话System.out.println(2-1.1);
这里面2是int类型数据,这么说吧
1.1是float 单精度,2是int型数据类型,二者相减,结果变成了二者中较高优先级的类型 .

如果想要得到0.9我认为有两种方法:
1.写一个函数来得到或者是
2.可以强转,就是在2-1.1前强转

希望对你有用!

评分

参与人数 2技术分 +1 黑马币 +6 收起 理由
黄玉昆 + 1 赞一个!
HM李帅 + 6 很给力!

查看全部评分

回复 使用道具 举报
这是由于Java中的简单浮点数类型float和double不能够进行精确运输的原因,用下四舍五入吧
回复 使用道具 举报
版主大人贾文泽的解释真心到位啊,膜拜!若要得到0.9,下面是一个很简单的方法:

截图01.jpg (13.39 KB, 下载次数: 9)

截图01.jpg
回复 使用道具 举报
建议你可以看看这个文章:http://bbs.itheima.com/thread-39797-1-1.html
大概理解一下为什么浮点数的精度会如此,就行了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马