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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

public class Test {
/**
  * @param args
  */
public static void main(String[] args) {
  // TODO Auto-generated method stub
  long  a = 100l;
  float f = a;
  System.out.println(f);
}
}

以上代码:是正确的,但是long类型的变量a 自动转换成了 float类型了,
但是我们知道 long类型占8个字节,而float占4个字节,按照小类型自动转换成大类型的话,
应该是float自动转换成long,而不是long自动转换成float,这个我没想明白是为什么,求解。谢谢大家!!!

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

6 个回复

倒序浏览
你设置的long值太小,无法研究原因。
  1. public static void main(String[] args) {
  2.   // TODO Auto-generated method stub
  3.   long a = 9223372036854775807l;
  4.   float f = a;
  5.   System.out.println(f);
  6.   
  7. }
复制代码
经研究结论是float虽32位,但因为浮点数并不单纯有整数部分组成,表示的范围要比64位的long还要大,但精度下降。
即float仍用32位表示了64位的long,用的指数形式,并不精确。

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
Long和Float都是Number类型的子类,在API文档中有一句话“Number的子类必须提供将表示的数值转换为 byte、double、float、int、long 和 short 的方法。”
也就是说,Float类内部提供了将Long类型数据转换成Float类型数据的方法,该方法的源代码如下:

  1. private final long value;
  2.         
  3. public float floatValue() {
  4.      return (float)value;
  5. }
复制代码
但是,正如一楼所说的:
float虽32位,但因为浮点数并不单纯有整数部分组成,表示的范围要比64位的long还要大,但精度下降。
即float仍用32位表示了64位的long,用的指数形式,并不精确。

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报
long是全部用来表示整数的
但是float分出一部分来表示整数,一部分表示指数,这样能表示的数就比long的大得多了。
希望能帮到你
回复 使用道具 举报
本帖最后由 棉/mg花/x糖 于 2013-5-22 22:40 编辑

楼主,您好,正如二楼所说的那样,你对long型数据设置太小。
但是对程序为什么能通过的并没有解释清楚,当下由我来跟你解释是为什么?

你也知道,数据类型之间的转换有个级别高低问题,这里,我就在讲一下:
(1)
类型级别的数据赋值给类型级别的变量时会丢失精度(还有可能会报错);
(2)类型级别的数据赋值给类型级别的变量时会有个类型自动升级的过程(隐式
         的,由系统自动完成)。


这里,虽然long型的级别要比float级别低,有个自动类型转换过程,
那为什么程序能通过且没有出错呢?
原因就在于:long数据过小

虽然long型占8个字节,float占4个字节,但是float数据,除了能表示小数,还能表示指数
float型数据表示的范围就远远大于long型数据了。

那么这里,有没有损失精度呢,可以明明白白的告诉你,绝对损失精度了,
这个精度不过是100的二进制表示的最前面的那一串无伤大雅的“0”,
存进float型空间时,结果任然没有变


但是,如果long型数据很大很大,那就很有可能会真正损失精度了,
表示的结果会完全不是我们预期的那样了
,希望能帮到你。

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报
long的范围是-2的63次方到+2的63次方-1;float的范围是-3.403E38次方到+3.408E38,float的编码存储是参照IEEE标准的,与long的存储方法不同,你可以看看IEEE标准的介绍
回复 使用道具 举报
所以float的范围是大于long的,可以自动转换
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马