You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中int转float再转回int结果不等的原理探究

int与float类型转换精度丢失的数学原理分析

先看测试代码:

public static void main(String[] args){
    int i = XXX;
    System.out.println( (int) ( (float) i ) );
}

核心原因:两种类型的存储结构差异

Java里的int是32位有符号整数,用二进制补码直接存储,能精确表示所有-2^31到2^31-1之间的整数。而float是IEEE 754标准的32位单精度浮点数,存储结构分为三部分:1位符号位、8位指数位、23位尾数位,用二进制科学计数法表示:
数值 = (-1)^符号位 × (1 + 尾数) × 2^(指数-127)

不同场景的精度表现

  • 小整数(如1234)精确转换:这类数的二进制有效位数少,转成float时,尾数位可以完全容纳所有有效位,不会丢失精度,转回int自然和原数一致。
  • Integer.MAX_VALUE精确转换:Integer.MAX_VALUE是2^31-1(二进制31个1),虽然它的二进制位数超过23位,但刚好是float能精确表示的数值——因为float的指数位可以覆盖这个范围,且该数恰好落在两个可表示浮点数的精确点上,所以转换后不会失真。
  • 大整数(如1234567990)精度丢失:当整数的二进制有效位数超过24位(尾数位23位+隐含的1位固定前缀)时,float无法存储所有细节,会把原数舍入到最近的可表示浮点数。比如1234567990的二进制有效位超过24位,转float时低位被截断舍入,变成了离它最近的可精确表示的整数1234567936;1235567990同理被舍入到1235568000,转回int后就和原数不等了。

简单说,就是float的有效精度只有24位二进制数,超过这个长度的整数转float必然会丢失低位信息,导致转回int后数值变化。

内容的提问来源于stack exchange,提问作者AJ_4real

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 05:40:31