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

Asyncpg读取PostgreSQL real类型数值显示异常问题

解决PostgreSQL real类型查询返回近似值的问题

问题根源

PostgreSQL的real属于单精度浮点数(32位),这类二进制浮点数无法精确表示所有十进制小数——比如1.3在二进制浮点数中本身就是无限循环的近似值,存入数据库时实际存储的就是1.2999999523162842,asyncpg只是如实返回了这个存储的原始值,并非查询过程出了问题。

可行解决方案

1. 改用精确小数类型(推荐)

如果业务需要精确存储十进制数值,把字段类型改成numeric(和decimal等价),它能精准存储任意精度的小数,存入1.3后查询会直接返回1.3。

修改表结构的SQL示例:

ALTER TABLE your_table ALTER COLUMN your_column TYPE numeric(10,1);

(numeric(10,1)表示总位数10、小数位1,可根据实际业务调整精度参数)

2. 查询时格式化数值

如果没法修改表结构,可以对查询返回的浮点数做格式化处理,保留指定小数位来还原预期值:

# 假设查询结果为row,目标字段名为target_col
raw_val = row['target_col']
# 保留1位小数得到1.3
formatted_val = round(raw_val, 1)

或者用字符串格式化确保输出符合预期:

formatted_val = f"{raw_val:.1f}"

3. 存入时提前处理精度

如果必须使用real类型,存入前先把数值四舍五入到需要的精度,确保存储的近似值在格式化后能还原为原始输入:

# 存入前处理数值
insert_val = round(1.3, 1)
await conn.execute('INSERT INTO your_table (target_col) VALUES ($1)', insert_val)

内容的提问来源于stack exchange,提问作者N.Maxim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 11:25:32