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
相关产品推荐
相关产品推荐

