黑马程序员技术交流社区

标题: 高手们帮我看看这个小程序出错在哪儿呢???!!! [打印本页]

作者: 要你快乐    时间: 2014-9-4 11:07
标题: 高手们帮我看看这个小程序出错在哪儿呢???!!!
  1. public class DoubleMinus {
  2.         public static void main(String[] args) {
  3.                 System.out.printf(2.0-1.1);
  4.         }
  5. }
复制代码



作者: 大酱菌    时间: 2014-9-4 11:08
printf    怎么打出个这个来?  单词错了? !!
作者: 要你快乐    时间: 2014-9-4 11:15
大酱菌 发表于 2014-9-4 11:08
printf    怎么打出个这个来?  单词错了? !!
  1. public class DoubleMinus {
  2.         public static void main(String[] args) {
  3.                 System.out.println(2.0-1.1);
  4.         }
  5. }
复制代码


问题是运行不能得到正确的结果呢
作者: OCTSJimmy    时间: 2014-9-4 11:31
要你快乐 发表于 2014-9-4 11:15
问题是运行不能得到正确的结果呢

这个问题与CPU的处理精度,以及浮点数的表示基本原理、浮点运算的机理这些部分有关系。
所以输出的结果是0.8999999999999999,而非0.9。

因此,建议浮点运算完毕后,按需要保留指定位数小数。
作者: 王凯路路    时间: 2014-9-4 11:33
我忘记在哪看过了...网上有资料说明这个的. 就记得会损失精度了,但是忘记为什么了
作者: 尚志    时间: 2014-9-4 11:36
1.1java中默认当double处理。
数据转为2进制处理,
2.0=10.0000000000000000截断
1.1=01.0001100110011001截断  SP:并不是所有的小数都能用2进制准确表示,这个就是一直循环。因为是double在这截断。
2数二进制相减,0.1110011001100111转为10进制只能接近0.8999999999999999了。

如果是(2.0f-1.1f)就能算出0.9
指明了2数为float型,但java先都转为doule型运算,然后四舍五入为0.9f.
(之前我也不明白,网上参考的这个,楼主可以看看)
作者: fantacyleo    时间: 2014-9-4 11:57
尚志 发表于 2014-9-4 11:36
1.1java中默认当double处理。
数据转为2进制处理,
2.0=10.0000000000000000截断

这个说法不对。double精度无法穷尽表示的2进制小数不是简单的截断,也存在“四舍五入”。2.0f-1.1f不会转为double,就是按float运算。
作者: ___瘦不了    时间: 2014-9-4 12:25
这是一个精华贴,坐等大神指教
作者: lq你微笑时好美    时间: 2014-9-4 12:59
因为数据在运算时,会进行数据类型隐式转换。float转换为double
作者: lq你微笑时好美    时间: 2014-9-4 13:02
除非在数据后面加f,就不会再隐式转换
作者: 28了还能学吗    时间: 2014-9-4 13:05
二进制 八进制什么的  弄不懂啊弄不懂
作者: 怀念黑海岸    时间: 2014-9-6 13:23
我表示我也蒙了。
作者: 黑马-胡明    时间: 2014-9-6 14:08
很简单的小常识问题。printf是格式化输出。是可以输出打印结果的,和println(换行输出)、print(同行输出)都一样,。但是你可能不太懂printf的使用方法:printf("<格式化字符串>", <参量表>); 。你是不是忘记添加格式化字符串,加上%f再试一试吧,要双引号括起来哦
作者: hmid    时间: 2014-9-6 20:01
13楼说的对啊。这样:System.out.printf("%f", 2.0-1.1);能得到正解。




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