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

Pandas DataFrame处理高精度浮点数据时的不一致表现

Pandas读取Oracle高精度数值时的精度异常问题及解决方法

问题场景

Oracle表中存储number(28,15)类型的高精度数值:45.200000000000003、12.699999999999999、99.745663,使用Pandas读取后出现精度异常:

  • 执行以下代码:
    dataframe = pandas.read_sql_query('select * from schema.table', connection)
    print(df['columnname'])
    
    默认输出会自动截断精度,结果为:
    0  45.2
    1  12.7
    3  99.745663
    
  • 设置显示精度后:
    pandas.set_option('display.precision', 15)
    
    前两个数值恢复原始精度,但第三个数值变为99.745662999999993,出现不可逆的精度偏差。

原因分析

Pandas默认会将Oracle的number类型映射为float64浮点数,而浮点数采用二进制存储,无法精确表示所有十进制小数。99.745663这类十进制值在二进制浮点数中只能以近似值存储,强制显示高精度时,就会暴露这种底层的近似误差。

解决方案

1. 读取时指定Decimal类型

直接将目标列指定为decimal.Decimal类型,绕过浮点数转换,保留原始十进制精度:

from decimal import Decimal
dataframe = pandas.read_sql_query(
    'select * from schema.table',
    connection,
    dtype={'columnname': Decimal}
)

2. 使用Pandas原生Decimal类型(Pandas 1.3+)

针对Oracle的number(28,15)定义,使用pandas.DecimalDtype精准匹配:

dataframe = pandas.read_sql_query(
    'select * from schema.table',
    connection,
    dtype={'columnname': 'decimal(28,15)'}
)

注意事项

  • 浮点数精度问题是二进制存储的固有特性,处理财务、计量类高精度数据时,必须优先使用十进制类型而非浮点数。
  • 确保Oracle驱动(如cx_Oracle)支持Decimal类型映射,避免驱动层面自动转换为浮点数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 10:27:05