PostgreSQL如何将double precision计算结果转为保留两位小数的numeric类型
调整方案
- 实现思路:使用PostgreSQL内置的
ROUND(numeric, integer)函数完成计算,该函数的返回值本身就是numeric类型,搭配第二个参数指定保留两位小数即可完全匹配输出要求;不要使用to_char函数,这类函数返回的是文本类型,不符合numeric的输出要求。 - 精度修正:原语句中将100转为double precision参与运算,会让整个计算链路走双精度浮点逻辑,存在不可控的精度偏差。既然最终输出要numeric类型,直接把运算环节的数值类型统一为numeric,就能从根源避免这类浮点误差。
调整后完整语句
SELECT ROUND( (e + u) * 100::numeric / (se + su + OLF), 2 ) AS "Sample" FROM lfs_dept, lfs_dept_final sm WHERE n = sn;
注意事项
- 上述语句输出的
Sample字段为固定标度的numeric类型,严格保留两位小数 - 不推荐直接对原double precision计算结果强转
::numeric(10,2):这类写法会保留浮点计算环节的累计误差,比如理论计算值12.35,可能因为浮点精度偏差被存储为12.3499999999,强转后会被截断为12.34,出现结果偏差 - 如果业务要求必须保留原有的double precision计算逻辑,可调整表达式为
ROUND( ((e + u) * 100::double precision / (se + su + OLF))::numeric, 2 ) AS "Sample",但仍需注意浮点精度带来的结果偏差风险。
内容的提问来源于stack exchange,提问作者Nora S
相关产品推荐
相关产品推荐

