黑马程序员技术交流社区

标题: 关于浮点数运算的问题 希望高人指教 [打印本页]

作者: HM李帅    时间: 2013-3-8 10:24
标题: 关于浮点数运算的问题 希望高人指教
本帖最后由 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
产生的原因是什么  怎么解决这种计算
作者: 贾文泽    时间: 2013-3-8 10:51
浮点数以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的二进制形式是无限循环的,,,我想我没必要在这里解释了。如果这个不了解那就该看看小数的二进制转化方法了
作者: 小丑的媳妇2    时间: 2013-3-8 10:52
终于抢了了沙发 你问的这个问题毕老师曾经在视频里讲过 就是 int double float 他们之间的优先级的问题
你这道题里面,你看这句话System.out.println(2-1.1);
这里面2是int类型数据,这么说吧
1.1是float 单精度,2是int型数据类型,二者相减,结果变成了二者中较高优先级的类型 .

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

希望对你有用!
作者: 冷叙辰    时间: 2013-3-8 10:57
这是由于Java中的简单浮点数类型float和double不能够进行精确运输的原因,用下四舍五入吧
作者: whs_nk    时间: 2013-3-8 11:21
版主大人贾文泽的解释真心到位啊,膜拜!若要得到0.9,下面是一个很简单的方法:

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

截图01.jpg

作者: 黄玉昆    时间: 2013-3-8 12:24
建议你可以看看这个文章:http://bbs.itheima.com/thread-39797-1-1.html
大概理解一下为什么浮点数的精度会如此,就行了。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2