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
相关产品推荐
相关产品推荐

