强制转换的核心是确保可预期、可控制、可恢复。int()仅接受合法整数字面量,float()支持更广但拒绝模糊输入;浮点转整须显式选择截断方式;用户输入需预清洗;精度敏感场景应使用Decimal替代float。

强制转换引发的数值问题,核心在于“看似能转、实则失真或失败”。关键不是避免转换,而是让每次转换都可预期、可控制、可恢复。
明确 int() 和 float() 的能力边界
int() 只接受语法合法的整数字面量:带正负号、无小数点、无逗号、无单位、无空格(首尾空白会自动 strip)。它不负责“理解意图”,只做严格解析。
-
能成功:
int("123")、int(" -45 ")、int("0x10", 16) -
必然失败:
int("12.3")(小数点)、int("1,000")(逗号)、int("$99.99")(符号)、int("")(空字符串)
float() 范围更宽,支持小数、科学计数法("1e-3")、"inf"、"nan",但仍拒绝模糊输入,如 "12.3.4" 或 "12,3"。
浮点转整必须主动选择截断方式
直接用 int(9.999) 得到 9,不是四舍五入,也不是向下取整——它是向零截断。若业务需要特定逻辑,就得显式调用对应函数:
- 要四舍五入 → 用
round(x)(注意:返回 float,需再套 int) - 要向下取整 → 用
math.floor(x) - 要向上取整 → 用
math.ceil(x) - 要向零取整(即默认 int 行为)→ 保留
int(x),但得写清楚注释
用户输入和脏数据必须预清洗
真实场景中,"1,234.56"、" $99.99 "、"N/A"、"无数据" 都可能混入输入流。不能指望 int() 或 float() 自动识别并清理。
- 先用正则或字符串方法剥离无关字符(如
re.sub(r'[^\d.-]', '', s.strip())) - 再判断是否含小数点,决定走
int()还是float() - 对结果做语义校验,比如“年龄不能为负”“价格不能为 nan”
一个健壮的转换函数应返回 None 或抛出定制异常,而不是让错误蔓延到下游计算中。
精度敏感场景绕开 float,改用 decimal
金融、计量等要求精确小数位的场合,float 的二进制表示本质就存在误差(如 0.1 + 0.2 != 0.3)。此时应切换到 decimal 模块:
- 用
Decimal('0.1') + Decimal('0.2')确保结果为Decimal('0.3') - 所有原始输入建议以字符串形式传入
Decimal,避免 float 中间态污染 - 运算后仍可用
quantize()控制小数位数,例如result.quantize(Decimal('0.01'))

















