如何在 Python 中截断浮点数至小数点后两位(不四舍五入)

9次阅读

如何在 Python 中截断浮点数至小数点后两位(不四舍五入)

本文介绍多种纯 python 方法(无需第三方库)将浮点数精确截断到小数点后两位,如将 `68.82809999` 转为 `68.82`,强调不使用 `round()`(因其四舍五入)而采用数学或字符串方式实现可靠截断。

在 Python 中,“保留两位小数”常被误解为 round(x, 2),但该函数执行的是 四舍五入 (例如 round(68.828, 2) 得 68.83),而题目明确要求 截断(truncation)——即直接丢弃第三位及之后所有小数,不进位。以下是几种推荐的纯 Python 实现方案:

✅ 方法一:数学法(推荐|精确、无精度陷阱)

利用 math.floor 放大再缩小,避免浮点表示误差:

import math  def truncate_to_2_decimals(x):     return math.floor(x * 100) / 100.0  # 示例 print(truncate_to_2_decimals(68.82809999))  # 输出: 68.82 print(truncate_to_2_decimals(-3.14159))     # 输出: -3.14(注意:floor 对负数向下取整,符合截断语义)

⚠️ 注意:此方法对负数也正确截断(如 -3.14159 → -3.14),因 math.floor(-314.159) == -315,故需确认业务是否要求“向零截断”。若需统一向零(即 -3.14159 → -3.14,3.14159 → 3.14),可改用 int(x * 100) / 100.0(但 int() 对负数是向零取整)。

✅ 方法二:字符串法(直观、易理解)

转为字符串后按小数点分割,手动拼接前两位小数:

立即学习Python 免费学习笔记(深入)”;

def truncate_to_2_decimals_str(x):     s = str(float(x))  # 确保为标准浮点字符串表示     if '.' not in s:         return float(s)     integer, decimal = s.split('.')     truncated_decimal = decimal[:2].ljust(2, '0')  # 不足两位补 0     return float(f"{integer}.{truncated_decimal}")  # 示例 print(truncate_to_2_decimals_str(68.82809999))  # 输出: 68.82 print(truncate_to_2_decimals_str(5.7))          # 输出: 5.70

? 优点:逻辑清晰,天然支持补零;缺点:依赖 字符串解析,对极小 / 极大数(科学计数法表示如 ‘6.88e+1’)需额外处理。

⚠️ 注意事项

  • 避免 round():它四舍五入,不符合“截断”需求;
  • 慎用 %.2f 或 f”{x:.2f}”:这是 格式化输出,返回字符串且默认四舍五入;
  • 浮点精度问题:如 0.1 + 0.2 != 0.3,数学法中 x * 100 可能引入微小误差,必要时可用 decimal.Decimal(但题目要求无库,故未展开);
  • 类型一致性 :以上函数均返回 float;若需固定精度数值(如货计算),建议后续使用 decimal 模块。

总结:对于大多数场景,*方法一(`math.floor(x 100) / 100.0)最简洁可靠 **;若需严格向零截断且兼容负数,可用 int(x * 100) / 100.0`。两者均无需外部依赖,符合题目“不使用库”的核心要求。

text=ZqhQzanResources