java float 强转int 出错,请高手解答!!!

家在水草丰茂的地方 2017-02-20 06:13:11
public class First {
public static void main(String args[])
{
float a=2147483641.01f;
System.out.println((int)a);
}
}

这段代码在eclipse中运行结果是 :2147483647

int 类型最大值就是 2147483647 可是我的float 小于这个数字,求大神解答
...全文
1248 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiajing1990_ 2017-02-23
  • 打赏
  • 举报
回复
4#说的不错
逗泥丸的平方 2017-02-22
  • 打赏
  • 举报
回复
引用 4 楼 lonrence 的回复:
这个问题可以讨论一下
		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);
但是发现了令人惊讶的结果

public class DummyTest {
    public static void main(String[] args) {
        System.out.println(9999999999999999999999999999f);
        System.out.println((int)9999999999999999999999999999f);
    }
}
result: 1.0E28 2147483647
JohnSession 2017-02-21
  • 打赏
  • 举报
回复
4楼说得不错! 还在学习中
  • 打赏
  • 举报
回复
这个问题可以讨论一下
		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);
陌上离离 2017-02-21
  • 打赏
  • 举报
回复
输出结果应该是2147483641啊,float转换成int会舍去啊
逗泥丸的平方 2017-02-21
  • 打赏
  • 举报
回复
Float的intValue也是直接return (int)value;的 估计是和jvm有关的东西了吧. 或者native? 不了解.
逗泥丸的平方 2017-02-21
  • 打赏
  • 举报
回复
引用 9 楼 qq_35209952 的回复:
[quote=引用 3 楼 qq_35155205 的回复:] 输出结果应该是2147483641啊,float转换成int会舍去啊
float的精度不够. 10位已经开始出事了~ 舍去的依据并不是根据我们直观上的小数点(float和int的差距),而是根据float本身能表达的位数决定的.[/quote] 好吧 感觉自己有点想当然了... 貌似超过最大值的时候 都会用最大int来代替
ryuugu_rena 2017-02-21
  • 打赏
  • 举报
回复
你定义float的时候就已经丢失精度了,还有float的底层表示和int类型的不一样,强转没什么意义
逗泥丸的平方 2017-02-21
  • 打赏
  • 举报
回复
引用 3 楼 qq_35155205 的回复:
输出结果应该是2147483641啊,float转换成int会舍去啊
float的精度不够. 10位已经开始出事了~ 舍去的依据并不是根据我们直观上的小数点(float和int的差距),而是根据float本身能表达的位数决定的.
法正稳妥妥 2017-02-21
  • 打赏
  • 举报
回复
4楼成功的把我说懵逼了!
xn5lnd 2017-02-21
  • 打赏
  • 举报
回复
用到了计算机底底层运算额
一个治疗术 2017-02-21
  • 打赏
  • 举报
回复
4楼正解//////
爱睡觉的阿狸 2017-02-21
  • 打赏
  • 举报
回复
4#的回复很精彩!
QuinnNorris 2017-02-20
  • 打赏
  • 举报
回复
精度丢失了啊,非要用float,double多好
  • 打赏
  • 举报
回复
跪求大神指导啊,万分感谢了!!!

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧