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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张亚青 中级黑马   /  2013-3-7 15:33  /  1226 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张亚青 于 2013-3-7 15:46 编辑
  1. package test;

  2. class Test1
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 int i=5;
  7.                
  8.                 i=i+5.0;//编译错误: 可能损失精度
  9.                 i+=5.0;//这里却可以顺利通过编译
  10.                 System.out.println(i);
  11.         }
  12. }
复制代码
问题:为什么i+=5.0; 这个语句可以通过编译? 求详细原理介绍。。。。

5 个回复

倒序浏览
本帖最后由 邹学良 于 2013-3-7 15:42 编辑

i+=5.0当相于我们常用的赋值
在内存中的执行步骤为:
int temp=i;
temp=temp+(int)5.0;
temp=i;
回复 使用道具 举报
  1. class Demo02
  2. {
  3.     public static void main(String[] args)
  4.     {
  5.             int i=5;               
  6.             //i=i+5.0;// 这句话相当于 i = (double)i+5.0; 5.0是double类型,i是int类型,他们运算时,int会转为double
  7.             i+=5.0;//这里相当于:i = i+(int)5.0; +=是赋值运算符,就是把double强制转为int赋给i
  8.             System.out.println(i);
  9.     }
  10. }
复制代码
回复 使用道具 举报
同学,请看这http://bbs.itheima.com/forum.php?mod=viewthread&tid=39894
请在提问之前做到以下几点:
①搜索下论坛看是否已有同学提问
②仔细回想毕老师是否讲解
③没有在提问,有的话就收藏吧!!
④个人建议:由于知识点比较多,建议做好笔记
回复 使用道具 举报
本帖最后由 韩松范 于 2013-3-7 15:48 编辑

这个搜索论坛会有答案
http://bbs.itheima.com/forum.php ... mp;page=1#pid241403
回复 使用道具 举报
   这是一个类型自动提升问题,首先要明确两点:
第一点:i+=5.0;这个的+=是赋值运算符,赋值的是两边的和,我们可以把这个条件表达式理解为i=i+5.0;
但是,不同的是底层会进行自动转换动作,将(i+5.0)的结果自动转换成int类型的值,然后再赋给左边的i。
第二点:在java中,默认情况下,各个基本数据类型间是可以进行转型操作的:
byte-->short-->int-->long-->float-->double。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马