C# 整型强制转换为float类型出现非预期结果的问题咨询
现象原因
该转换结果和溢出无关,是单精度浮点数(float)的固有精度限制导致的。
32位float遵循IEEE 754存储规范,存储空间分为三部分:1位符号位、8位指数位、23位尾数位。尾数位隐含1位前导有效位,因此实际有效精度为24位二进制,对应十进制约6~7位有效数字。所有大于2^24(即16777216)的整数,都无法被float类型精确表示,数值越大,可表示的整数间隔步长越大。
- 测试用的数值
100008009落在[2^26, 2^27)区间,该区间内float的整数表示步长为2^(26-23) = 8,仅能精确表示间隔为8的整数 100008008是距离100008009最近的可精确表示的float值,按照默认的就近舍入规则,转换后就会得到100008008的结果
无警告的原因
这类精度丢失不属于语法错误、也不属于溢出错误,因此编译器默认不会触发警告。如果需要识别这类转换风险,可以手动开启编译器对应警告选项,例如GCC/Clang下的-Wconversion参数。
内容的提问来源于stack exchange,提问作者profimedica
相关产品推荐
相关产品推荐

