整数的默认类型为int
小数的默认类型是double
float f = 30.4; 编译出错:可能损失精度
如果是因为 30.4是double类型,造成向下转型失败
那 byte b = 30; 为什么编译不会出错?30默认是int类型,int比byte大,为什么能编译成功呢?矛盾中。。

解决方案 »

  1.   

    30.4是小数,默认是double的,首先很多小数计算机是不能精确表示的,所以转为float后就可能损失精度但是整数就没有不能精确表示的问题
      

  2.   

    那么
    int i = 30;
    byte b = i; 此处为何又出错:可能损失精度
      

  3.   

    double的30.4和float的30.4精度是不一样的。
    但int的30和byte的30却是一样的
      

  4.   

    既然是一样为什么定义一个int变量让byte接收不了?
    int i = 30;
    byte b = i;
      

  5.   

    明白了,应该是30在byte取值范围内,所以可以直接赋值给byte。
    而int类型的i变量是不确定,所以byte无法接收。是不是要这样理解?
      

  6.   

    我觉得应该是这样的
    凡是存储范围小的变量不能直接赋值给存储量大的变量,即int的变量不能赋值给long,其他一样。
    不关什么“可能损失精度”的事,这只是一个提示。
    要将存储范围小的变量赋值给存储量大的变量就要用强制转换。long l = 1;int i = (int)l;(尽管转换后可能损失精度)还有float的赋值好像是这样的 f = 30.4F
      

  7.   

    又引申一个问题出来,30.4也是在float取值范围内,为什么要加上F才编译通过?
    然道是float是单精度,double是双精度,所以要加上F告诉编译器这个是float?
      

  8.   

    这应该是一种语言规范
    C语言中不用加F
    又例如java中long类型的变量若大于2147483647(int的范围)就需要加L
    而在C#中则可以不用L
      

  9.   

    我错了,
    看这个http://topic.csdn.net/u/20090410/06/c44f7022-8011-4aec-a067-19a61abe6b86.html
      

  10.   

    结贴,byte b = 30;存在隐式转换,超出范围将报错