public class First {
public static void main(String args[])
{
float a=2147483641.01f;
System.out.println((int)a);
}
}这段代码在eclipse中运行结果是 :2147483647int 类型最大值就是 2147483647 可是我的float 小于这个数字,求大神解答
public static void main(String args[])
{
float a=2147483641.01f;
System.out.println((int)a);
}
}这段代码在eclipse中运行结果是 :2147483647int 类型最大值就是 2147483647 可是我的float 小于这个数字,求大神解答
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);
float的精度不够. 10位已经开始出事了~ 舍去的依据并不是根据我们直观上的小数点(float和int的差距),而是根据float本身能表达的位数决定的.
float的精度不够. 10位已经开始出事了~ 舍去的依据并不是根据我们直观上的小数点(float和int的差距),而是根据float本身能表达的位数决定的.
好吧 感觉自己有点想当然了... 貌似超过最大值的时候 都会用最大int来代替
public static void main(String[] args) {
System.out.println(9999999999999999999999999999f);
System.out.println((int)9999999999999999999999999999f);
}
}
result:
1.0E28
2147483647