Python如何不四舍五入截断浮点数小数点后的指定位数
Python 浮点数指定小数位截断实现方案
核心实现(常规场景)
通过「放大对应倍数→取整→缩小回原倍数」的逻辑实现截断,如需固定位数补零可直接返回格式化字符串:
def truncate_float(f, n, return_str=True): multiplier = 10 ** n # 截断核心逻辑:乘10的n次方后取整丢弃小数位,再缩回去 truncated_val = int(f * multiplier) / multiplier if return_str: # 格式化补末尾零 return f"{truncated_val:.{n}f}" return truncated_val
效果测试
a = 9.43257 b = 32.8 print(truncate_float(a, 3)) # 输出 '9.432' print(truncate_float(b, 4)) # 输出 '32.8000' # 不需要字符串格式的话传return_str=False print(truncate_float(a, 3, return_str=False)) # 输出 9.432
高精度场景实现(避免浮点数精度误差)
如果是金融、计量等对数值精度要求极高的场景,建议用decimal模块实现,规避原生浮点数的精度丢失问题:
from decimal import Decimal, ROUND_DOWN def truncate_float_precise(f, n, return_str=True): d = Decimal(str(f)) # 指定ROUND_DOWN模式直接截断,不做四舍五入 truncated = d.quantize(Decimal(f'0.{"0"*n}'), rounding=ROUND_DOWN) if return_str: return str(truncated) return float(truncated)
常见方案踩坑说明
你之前用到的round()函数、f-string/format默认格式化,底层默认使用四舍五入的舍入策略,无法满足纯截断的需求,所以不适用该场景。
内容的提问来源于stack exchange,提问作者baronsec
相关产品推荐
相关产品推荐

