黑马程序员技术交流社区
标题:
关于浮点数运算的问题 希望高人指教
[打印本页]
作者:
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, 下载次数: 9)
下载附件
2013-3-8 11:21 上传
作者:
黄玉昆
时间:
2013-3-8 12:24
建议你可以看看这个文章:
http://bbs.itheima.com/thread-39797-1-1.html
大概理解一下为什么浮点数的精度会如此,就行了。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2