public class First {
public static void main(String args[])
{
float a=2147483641.01f;
System.out.println((int)a);
}
}这段代码在eclipse中运行结果是 :2147483647int 类型最大值就是 2147483647  可是我的float 小于这个数字,求大神解答

解决方案 »

  1.   

    精度丢失了啊,非要用float,double多好
      

  2.   

    输出结果应该是2147483641啊,float转换成int会舍去啊
      

  3.   

    这个问题可以讨论一下
    float f = 2147483641.01f;
    /* float类型的二进制存储是4个字节32位  1位字符位,8位指数位,23位小数位
     *  2147483641.01
     *  转化二进制->1111111 11111111 11111111 11111001.0000000101000...
     *  左移30位->1.1111111111111111111111111110010000000101000
     *  计算指数位->30+127=157=128+16+8+4+1=10011101
     *  0 10011101 11111111 11111111 11111111
     *  取23位小数位。第24位0舍1入 
     *  ->0 10011110 00000000 00000000 0000000的出的结果与Float.floatToIntBits(f)方法一致
     * 
     * 反向操作
     * 取出小数部分1.00000000 00000000 0000000
     * 计算指数 10011110->158 - 127 = 31
     * 左移31位1 00000000 00000000 0000000 0000000.0
     * 计算出结果是2147483648
     * 
     * 问题应该出在截取小数位上,但可以肯定的是精度损失了,造成的数据失真
     * 而且数字越大精度损失越大,整数二进制占位数侵占了小数的。
     * 
     *  
     *  
     */
    System.out.println(f);
            //f的二进制表现形式
    int floatToInt = Float.floatToIntBits(f);
    System.out.println("二进制存储格式为: "+Integer.toBinaryString(floatToInt));
    System.out.println("float类型强制转换为: " + (int)f);

    double d = 2147483641.01;
    System.out.println("double类型强制转换为: " + (int)d);
      

  4.   


    float的精度不够.  10位已经开始出事了~  舍去的依据并不是根据我们直观上的小数点(float和int的差距),而是根据float本身能表达的位数决定的.
      

  5.   

    你定义float的时候就已经丢失精度了,还有float的底层表示和int类型的不一样,强转没什么意义
      

  6.   


    float的精度不够.  10位已经开始出事了~  舍去的依据并不是根据我们直观上的小数点(float和int的差距),而是根据float本身能表达的位数决定的.
    好吧 感觉自己有点想当然了... 貌似超过最大值的时候 都会用最大int来代替
      

  7.   

    Float的intValue也是直接return (int)value;的  估计是和jvm有关的东西了吧. 或者native? 不了解.
      

  8.   

     但是发现了令人惊讶的结果public class DummyTest {
        public static void main(String[] args) {
            System.out.println(9999999999999999999999999999f);
            System.out.println((int)9999999999999999999999999999f);
        }
    }
    result:
    1.0E28
    2147483647