You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python如何实现浮点数截断保留2位小数且不四舍五入,不足补0

浮点数截断问题解答

1. 你提出的新方案不稳定不可行

  • 核心问题在于Python原生float采用二进制存储,绝大多数十进制小数无法被精确表示,比如31.4实际存储值可能为31.399999999999998,乘1000、取整再做除法的操作会放大精度误差,依然会出现你之前遇到的31.4输出31.39这类异常。
  • 方案本身存在逻辑错误:乘1000后除以100再除以10属于冗余操作,无实际意义且容易引入额外误差。

2. 规范实现方式

直接使用decimal模块内置的截断规则即可,不需要自行实现字符串切割、乘除取整逻辑,从根源规避精度问题:

from decimal import Decimal, ROUND_DOWN

def truncate_2_places(num):
    # 若输入为float类型,先转字符串再转Decimal,避免float本身的精度误差带入计算
    if isinstance(num, (int, float)):
        num_dec = Decimal(str(num))
    else:
        num_dec = num
    # 保留2位小数,直接截断后续位,不触发四舍五入
    result = num_dec.quantize(Decimal('0.00'), rounding=ROUND_DOWN)
    return result

# 测试验证
print(truncate_2_places(35.3169)) # 输出 35.31
print(truncate_2_places(31.1))    # 输出 31.10
print(truncate_2_places(31.4))    # 输出 31.40
print(truncate_2_places(31.5))    # 输出 31.50
print(truncate_2_places(30.22))   # 输出 30.22

实现说明

  • quantize是Decimal模块专门用于小数位数调整的内置方法,准确性和兼容性远高于自定义实现
  • ROUND_DOWN参数指定向零截断规则,完全不会触发四舍五入
  • 最终返回结果自动补全第二位小数,符合输出格式要求

内容的提问来源于stack exchange,提问作者GH00N

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 17:15:05