cx_Oracle查询时的数字精度问题
有时在用cx_Oracle查询数据库时,会发现查询的数字丢失了精度,变得奇怪。这是因为Oracle里number使用十进制数字,而这并不能完全无缝转换为二进制数字的表现形式,如Python里处理小数默认的float类型。所以这时候就要做一个类型的转换,将查询的数字转换成decimal或者string类型都可以,以避免数字精度的丢失。
假设已经连上了数据库,游标是 cursor 。
把类型转换的方法写出来,如下:
|
1 2 3 4 5 6 7 8 9 10 |
# number转换为decimal import decimal def number_to_decimal(cursor, name, defaultType, size, precision, scale): if defaultType == cx_Oracle.NUMBER: return cursor.var(decimal.Decimal, arraysize=cursor.arraysize) # number转换为string def number_to_string(cursor, name, defaultType, size, precision, scale): if defaultType == cx_Oracle.NUMBER: return cursor.var(str, arraysize=cursor.arraysize) |
然后将类型转换的方法传入到 cursor.outputtypehandler 中,执行查询,并将查询结果取出至dataframe中,如下:
|
1 2 3 4 5 6 |
cursor.outputtypehandler = number_to_decimal cursor.execute(sql) import pandas as pd columns_name = [tuple[0] for tuple in cursor.description] data = pd.DataFrame(cursor.fetchall(), columns=columns_name) |
这样所查询出来的数字结果就不会出现数字精度丢失的问题了。