精度变化主要发生在浮点与整数、不同位宽浮点、有符号/无符号整数转换时;浮点转整数向零截断,低精度转高精度不恢复精度,整数转浮点可能舍入,有符号/无符号转换按位解释易致值剧变。

不同类型转换时,精度变化主要发生在浮点数与整数、不同位宽浮点数之间,以及有符号/无符号整数互转时。关键不是“能不能转”,而是“转完还准不准”。
浮点数转整数:直接截断,不四舍五入
float 或 double 转 int、long 等整型时,小数部分被直接丢弃(向零截断),不进行任何舍入。
- C/C++/Java/Python(int())都如此:int(3.9) → 3,int(-2.7) → -2
- 若值超出目标整型范围(如 float 1e10 转 int),行为未定义(C/C++)或抛异常(Java/Python)
- 建议先用范围检查 + round() 显式控制舍入逻辑,例如:int(round(x)) 实现四舍五入
低精度浮点转高精度浮点:无损,但不增加真实精度
float(通常32位)→ double(64位)是安全的,数值不变,但不会“恢复”已丢失的精度。
- float f = 0.1f; // 实际存储的是近似值 0.10000000149...
- double d = f; // d 的值仍是那个近似值,只是用更多位表示它,不是更精确的 0.1
- 真正提升精度需从高精度源头赋值:double d = 0.1; // 比 float 赋值更接近数学 0.1
整数转浮点数:位数足够时无损,否则舍入
32位 int → float 通常安全(float 有效位约7位十进制,能精确表示所有 ≤2²⁴ 的整数);64位 long → float 则大概率丢失精度。
- int x = 16777215; // 2²⁴−1,float 可精确表示
- int y = 16777216; // 2²⁴,float 仍可表示(因是2的幂)
- int z = 16777217; // float 会舍入为 16777216 —— 精度丢失开始出现
- 验证方式:转换后转回原类型,比较是否相等(如 (int)(float)x == x)
有符号 ↔ 无符号整数转换:按位解释,值可能剧变
这不是“数值转换”,而是重新解释相同比特序列,符号位变成数据位,结果常与直觉相反。
- int x = -1; → unsigned int u = (unsigned int)x; // u = 4294967295(32位)
- unsigned int u = 4294967295U; → int x = (int)u; // x = -1(若系统用补码)
- 这种转换在指针运算、字节处理中常见,但用于算术比较极易出错,应避免隐式转换
- 编译器警告(如 GCC 的 -Wsign-conversion)值得开启并认真对待

















