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

Pandas 2.2.0中DataFrame小数舍入异常问题咨询

问题成因与解决方案:pandas/numpy舍入后出现精度偏差

问题成因

这是IEEE 754双精度浮点数的固有精度限制导致的:

  • 双精度浮点数的有效十进制位数约为15-17位,虽然26586491.0本身可以被精确存储为双精度浮点数,但执行round(15)操作时,舍入算法的底层运算可能触发浮点数的精度边界,导致结果出现极微小的偏移。
  • pandas的round方法底层依赖numpy的实现,因此两者会表现出相同的精度问题。

规避方法

1. 使用decimal模块进行高精度计算

用Python标准库的decimal模块替代原生浮点数,可精确控制舍入规则和精度:

from decimal import Decimal, ROUND_HALF_UP

# 用字符串初始化Decimal以避免浮点数精度损失
val = Decimal("26586491.0")
# 舍入到15位小数
rounded_val = val.quantize(Decimal("0.000000000000000"), rounding=ROUND_HALF_UP)
# 转换为float仍保持精确
float(rounded_val)  # 输出26586491.0

2. 采用阈值比较替代精确相等判断

如果必须使用浮点数,不要直接用==进行精确比较,而是判断差值是否小于极小阈值(如1e-9):

import pandas as pd

expected = 26586491.0
actual = pd.DataFrame({"value": [26586491.0]}).round(15)["value"].iloc[0]

# 阈值比较
if abs(actual - expected) < 1e-9:
    print("值相等")

3. 使用pandas的Decimal数据类型

pandas 1.3+支持直接存储Decimal类型的列,从根源避免浮点数误差:

import pandas as pd
from decimal import Decimal, ROUND_HALF_UP

# 用Decimal类型初始化DataFrame
df = pd.DataFrame({"value": [Decimal("26586491.0")]})
# 自定义舍入操作
df["rounded_value"] = df["value"].apply(
    lambda x: x.quantize(Decimal("0.000000000000000"), rounding=ROUND_HALF_UP)
)
# 结果为精确的Decimal('26586491.000000000000000')
print(df["rounded_value"].iloc[0])

4. 舍入后转换为整数(适用场景)

如果你的业务逻辑中舍入后结果应为整数,直接转换为int类型可消除浮点数偏差:

import pandas as pd

result = pd.DataFrame({"value": [26586491.0]}).round(15)["value"].iloc[0]
# 转换为整数
int(result)  # 输出26586491

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 20:20:25