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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 邹学良 中级黑马   /  2013-3-5 21:18  /  1927 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 邹学良 于 2013-3-6 11:19 编辑
  1. class All
  2. {
  3. public static void main(String[] args) {
  4. float f= 1;
  5. // f = f + 1.15;
  6. f+=1.15;
  7. System.out.print(f);
  8. }
  9. }
复制代码
f = f + 1.15不能编译通过这个知道原因,只是为何f+=1.15能执行呢?

大神们,我的意思就是想知道f+=1.15在内存中怎么实现转换的?

8 个回复

倒序浏览
我刚才试过了,都能编译成功,并且都能输出结果。
你在按照步骤认真地试一遍

点评

兄弟你再试试吧,f = f + 1.15不强转都能过?  发表于 2013-3-5 21:34
回复 使用道具 举报
本帖最后由 张洪慊 于 2013-3-5 21:49 编辑

这个问题在论坛也有,请搜索下
首先知道浮点数默认为double
f=f+1.5;//f在运算时会被提升为double, f+1.5,运算结果为double, 不能放在float中 (损失精度)注意这个表达式经过两次运算 先+在赋值
f+=1.5;//+=运算符属于赋值运算符,这个表达式只进行一次赋值运算(相当于a=b);把=左右两边运算结果赋值给左边
          //JVM内部有一个自动强转动作,在这里前提是不能超出float范围
//视频上也有啊,接着往后看,别急

评分

参与人数 1黑马币 +12 收起 理由
黄玉昆 + 12 赞一个!

查看全部评分

回复 使用道具 举报
f = f + 1.15;  后升级为double型,再赋值给f,导致精度丢失,从而报错。
f+=1.15   这个运算符本身就曾在的,会自动转型的
回复 使用道具 举报
1.15默认是double类型 float是单精度浮点数在机内占4个字节,用32位二进制描述。 double双精度浮点数在机内占8个字节,用64位二进制描述。

例如:(1) short s = 2; s = s+4;
(2) short s = 2; s+=4;
问题是上面的这两个错了吗?
答:第(1)个错了,因为s是short型的,占两个字节,4是默认的int的型的,占4个字节;(1)中先做加法运算,在做赋值运算;显然short没有办法装下int型的;
       因此可以修改为s=(short)(s+4);即把结果强制转换为short型的。
       第(2)个是正确的,这个只做赋值运算,内部有一个转换类型动作,所以是正确的。

评分

参与人数 1黑马币 +9 收起 理由
黄玉昆 + 9 赞一个!

查看全部评分

回复 使用道具 举报
彭波 发表于 2013-3-5 21:54
1.15默认是double类型 float是单精度浮点数在机内占4个字节,用32位二进制描述。 double双精度浮点数在机内 ...

我也知道它是在强转,就是想弄明白它在内存中到底是怎么操作的
回复 使用道具 举报
f+=1.15是赋值操作,类似于:
float temp= f;
f = (float)1.15;
f = temp + f;
回复 使用道具 举报
邹学良 发表于 2013-3-5 21:59
我也知道它是在强转,就是想弄明白它在内存中到底是怎么操作的

嗯,可以看七楼的,
回复 使用道具 举报
一句话,就是+=这种符号,可以实现自动转型!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马