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"是怎么来的?
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"是怎么来的?
所以才有了上面的表示.
PS:貌似java对上述处理是取头顶操作,或者是java对于浮点的舍弃位不是很准确.反正有映像看过书说到是两者之一.
比如System.out.println( 2.0f - 1.9f );
其实你用println打印时
它把float用toJavaFormatString()转成string
可能转的时候截取了 出现了结果不同的原因具体的你还要看相应的源码
和float的运算原理所以一些元素按最好避开float
一个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
1001100111010110111100110100011上面的结果只有31位,前面的0不打印。实际的情况是:0 1001 1001 1101 0110 1111 0011 0100 011
^ ^ ^
符号位 移位数 小数部分
8位的移位数要看成无符号数,1001 1001转为10进制就是128+16+8+1=153,移位数是153-127=26位。