黑马程序员技术交流社区

标题: 求高手指教:下面程序输出的结果是多少? [打印本页]

作者: 王小丑    时间: 2013-2-22 21:16
标题: 求高手指教:下面程序输出的结果是多少?
高手指教,下面输出的最终结果多少?
代码如下:
System.out.println(5.0942*1000);
System.out.println(5.0943*1000);
System.out.println(5.0944*1000);的结果
作者: 江华    时间: 2013-2-22 21:24
本帖最后由 江华 于 2013-2-22 21:50 编辑

有意思啊!
这个应该是数据类型的问题。
机器打印的是
5094.2
5094.299999999999
5094.400000000001
这样明显计算错误!
最可能的原因就是数据类型了。

同求高手指点!




作者: 曹春贵    时间: 2013-2-22 21:47
5094.2
5094.299999999999
5094.400000000001
原理和和浮点数的计算机表示有关,如果没有上机测试就能答对,你最好去微软,接替安德尔森。网上变态的面试题。
感叹{:soso_e193:}
作者: 江华    时间: 2013-2-22 21:47
不是我解决的,是群里提供的方法:
  1. System.out.println( 5.0943f*1000);
  2. System.out.println( 5.0944f*1000);
复制代码
这样可以防止错误的出现!
具体出现错误的原因是计算机对浮点数表示的原因。
作者: 胥文    时间: 2013-2-22 22:20
一看就是类型转换的问题
这样写不会有问题,不同类型的数相互运算的时候会丢失精度的
System.out.println((float)(5.0942*(float)1000));
System.out.println((float)(5.0943*(float)1000));
System.out.println((float)(5.0944*(float)1000));
作者: 贾文泽    时间: 2013-2-22 22:27
首先,要了解浮点数是以IEEE754标准转化为二进制代码存储在计算机中的,他的这种存储编码导致了不管是float还是double都无法精确的存储一个浮点数
比如说 x=6.234;  逻辑上讲,那x就等于6.234,但是是不对的,浮点数的存储编码的缺陷导致真正存入计算机的可能是非常接近6.234的一个浮点数,比如6.23999999999   当然也可能是6.2340000000001

由于浮点数无法精确存储,引发了两个编程问题
1. 一个浮点型的变量X,怎么判断X值是否为0 ? 因为真正存入计算机的浮点数都是一个近似值
   解决方法:   if(|X-0.000001|<0.000001)
                          是0
                     else
                          不是0
2.为什么循环更新的变量不能定义成浮点型?
  1. float i;
  2. float sum=0;
  3. for(i=1.0;i<=100;++i){  //  如果 i 是浮点型,最后一次的i很可能是100.00000001  就少了一次循环
  4.         sum=sum+1/i;
  5. }
复制代码
逻辑上讲这段代码是没有错误的,但是由于浮点数无法在计算机中精确存储,所以这段代码就变的有问题了。。
作者: 王小丑    时间: 2013-2-23 17:32
原理和和浮点数的计算机表示有关,答案应该是5094.2 5094.299999999999 5094.400000000001 我运行出来了
作者: 王小丑    时间: 2013-2-23 17:32
原理和和浮点数的计算机表示有关,答案应该是5094.2 5094.299999999999 5094.400000000001 我运行出来了
作者: 张宁    时间: 2013-2-25 15:56
在小数前面加f,改成浮点型。不然会有精度缺失的。
作者: 贾文泽    时间: 2013-2-25 16:12
张宁 发表于 2013-2-25 15:56
在小数前面加f,改成浮点型。不然会有精度缺失的。

你就是给他加个啥都会丢失精度的
作者: 张宁    时间: 2013-2-25 16:22
贾文泽 发表于 2013-2-25 16:12
你就是给他加个啥都会丢失精度的

为什么呢
作者: 贾文泽    时间: 2013-2-25 16:42
张宁 发表于 2013-2-25 16:22
为什么呢

IEEE标准就是这么定义的,32位的浮点数范围是3*10的38次方个,能表示的只有10^10个,还有很多不能精确表示的
把小数存入计算机得三个步骤
1. 转化成二进制
2.用二进制科学算法表示
3.表示成IEEE754形式
第一步跟第三步都可能丢失精度//////

5.0942     //这个数为什么能精确表示,因为最后面的是2.是10的因子, 可以精确的转换成二进制
5.0943
5.0944   //这两个数是不能精确表示的, 比如让你把0.4写成二进制形式,肯定是无限循环的么




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