Python Pandas DataFrame中如何对Loss Ratio百分比列四舍五入保留2位小数
问题根因
- 浮点数精度问题:0.805这类十进制小数无法被二进制浮点数精确存储,实际存储的数值会略小于0.805,触发舍入规则时会被判定为不足0.805
- Pandas默认舍入规则为银行家舍入(四舍六入五成双):当舍入位刚好是5时,会向最近的偶数方向舍入,0.805按该规则会舍入为0.80而非0.81
可用解决方案
方案1:放大转整数后舍入(简单高效,适合大多数场景)
通过放大100倍后再加微小偏移量抵消浮点数误差,再做舍入,代码如下:
# 加1e-8是为了抵消浮点数存储的微小负偏差,避免误判 df['Loss Ratio'] = (df['Loss Ratio'] * 100 + 1e-8).round() / 100
方案2:用Decimal模块指定标准四舍五入规则(精度最高,严格遵循四舍五入)
如果需要完全符合日常使用的四舍五入规则(ROUND_HALF_UP,即逢5进1),可以使用Python标准库的Decimal模块实现:
from decimal import Decimal, ROUND_HALF_UP df['Loss Ratio'] = df['Loss Ratio'].apply( lambda x: float(Decimal(str(x)).quantize(Decimal('0.00'), rounding=ROUND_HALF_UP)) )
以上两种方案处理后,你示例中的0.805都会被正确舍入为0.81,其余数值也符合预期效果。
内容的提问来源于stack exchange,提问作者newt335
相关产品推荐
相关产品推荐

