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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. public class DoubleMinus {
  2.         public static void main(String[] args) {
  3.                 System.out.printf(2.0-1.1);
  4.         }
  5. }
复制代码


13 个回复

倒序浏览
printf    怎么打出个这个来?  单词错了? !!
回复 使用道具 举报
大酱菌 发表于 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. }
复制代码


问题是运行不能得到正确的结果呢
回复 使用道具 举报
要你快乐 发表于 2014-9-4 11:15
问题是运行不能得到正确的结果呢

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

因此,建议浮点运算完毕后,按需要保留指定位数小数。
回复 使用道具 举报
我忘记在哪看过了...网上有资料说明这个的. 就记得会损失精度了,但是忘记为什么了
回复 使用道具 举报
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.
(之前我也不明白,网上参考的这个,楼主可以看看)
回复 使用道具 举报
尚志 发表于 2014-9-4 11:36
1.1java中默认当double处理。
数据转为2进制处理,
2.0=10.0000000000000000截断

这个说法不对。double精度无法穷尽表示的2进制小数不是简单的截断,也存在“四舍五入”。2.0f-1.1f不会转为double,就是按float运算。
回复 使用道具 举报
这是一个精华贴,坐等大神指教
回复 使用道具 举报
lq你微笑时好美 来自手机 中级黑马 2014-9-4 12:59:02
9#
因为数据在运算时,会进行数据类型隐式转换。float转换为double
回复 使用道具 举报
lq你微笑时好美 来自手机 中级黑马 2014-9-4 13:02:36
10#
除非在数据后面加f,就不会再隐式转换
回复 使用道具 举报
二进制 八进制什么的  弄不懂啊弄不懂
回复 使用道具 举报
我表示我也蒙了。
回复 使用道具 举报
很简单的小常识问题。printf是格式化输出。是可以输出打印结果的,和println(换行输出)、print(同行输出)都一样,。但是你可能不太懂printf的使用方法:printf("<格式化字符串>", <参量表>); 。你是不是忘记添加格式化字符串,加上%f再试一试吧,要双引号括起来哦
回复 使用道具 举报
13楼说的对啊。这样:System.out.printf("%f", 2.0-1.1);能得到正解。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马