public class test2_2 {
 public static void main(String[] args) {
  int c = 2200;
  long d = 8000;
  float f;
  double g = 123456789.123456789;
  c = (int) d;
  f = (float) g;
  System.out.println("c=" + c);
  System.out.println("d=" + d);
  System.out.println("f=" + f);
  System.out.println("g=" + g); }
}运行结果是
c=8000
d=8000
f=1.23456792E8
g=1.2345678912345679E8请问f=1.23456792E8里E前面的"2"是怎么来的?

解决方案 »

  1.   

    好像是Java对于浮点数的计算机制不是四舍五入,因为double类型强制转换成float类型超出了float类型的表示范围,所以java会对超出的部分做一定处理,而恰恰这种处理不是按照float转int的四舍五入机制进行的.
    所以才有了上面的表示.
    PS:貌似java对上述处理是取头顶操作,或者是java对于浮点的舍弃位不是很准确.反正有映像看过书说到是两者之一.
      

  2.   

    这是由于在Java中浮点型的数在编译中是采用二进制来计算操作的,这里的2e是一个整体,只是一种标志,和e一样。
      

  3.   

    float的精度一般会有问题
    比如System.out.println( 2.0f - 1.9f );
     其实你用println打印时
    它把float用toJavaFormatString()转成string 
    可能转的时候截取了  出现了结果不同的原因具体的你还要看相应的源码
    和float的运算原理所以一些元素按最好避开float 
      

  4.   

    f1oat数只能保存23二进制的有效数字.
    一个float数在内存是四个字节,共32位二进制,最高的一位是符号位,接下来的8位是用来保存二进制小数点的移位数,再接下来的23有二进制是用来保存小数的.
    比如;
    如果把123456789看成一个float数,则,要把123456789转为二进制:111010110111100110100010101
    然后要把小数点移到第一个1的后面1.11010110111100110100010101,移过的位数保存了那8位中.
    而把1.11010110111100110100010101的1101 0110 1111 0011 0100 0101 01保存取23中,注意整数部分的1不保存.共有27位,所以最后的三位要舍掉了,按0舍1入的规则舍掉,所以保存到23中的是:
    1101 0110 1111 0011 0100 011
    如果要把这个float按10进制打印出来,就要再转为10进制。
    1、把23位1101 0110 1111 0011 0100 011看做1.1101 0110 1111 0011 0100 011
    2、小数点按8位二进制的数移位:1 1101 0110 1111 0011 0100 0110 00.(这是小数点)
    3、符号位是正,所以把1 1101 0110 1111 0011 0100 0110 00转为10进制:123456792
    下面的代码能帮助你理解:
    public class Test{
        public static void main(String args[])  {
         System.out.println("整数123456789的二进制表示是:");
         System.out.println(Integer.toBinaryString(123456789));
         System.out.println("二进制111010110111100110100011000所表示的整数是:");
         System.out.println(Integer.valueOf("111010110111100110100011000",2));
        
         System.out.println("float类型的123456789的机内表示是:");
         System.out.println(Integer.toBinaryString(Float.floatToIntBits(123456789f)));
     
        }
    }
    结果如下:
    F:\java>java Test
    整数123456789的二进制表示是:
    111010110111100110100010101
    二进制111010110111100110100011000所表示的整数是:
    123456792
    float类型的123456789的机内表示是:
    1001100111010110111100110100011
      

  5.   

    float类型的123456789的机内表示是: 
    1001100111010110111100110100011上面的结果只有31位,前面的0不打印。实际的情况是:0       1001 1001  1101 0110 1111 0011 0100 011
    ^       ^          ^
    符号位   移位数       小数部分
    8位的移位数要看成无符号数,1001 1001转为10进制就是128+16+8+1=153,移位数是153-127=26位。