不同Postgres/PostGIS安装环境下相同查询结果精度差异原因咨询
ST_AsText跨环境输出精度差异原因说明
你观察到的差异和几何数据本身无关,两个实例存储的坐标值完全一致(返回的WKB二进制串完全相同即可证明),差异全部来自浮点数转文本的上层实现,具体原因分为三类:
- 底层C标准库实现差异
ST_AsText的浮点转字符串逻辑最终依赖操作系统自带的glibc库printf系列函数实现:CentOS 9默认搭载glibc 2.34及以上版本,而Kubuntu 20.04默认搭载glibc 2.31版本,不同版本glibc在处理双精度浮点数的高精度打印(15位小数及以上)时,舍入规则、末尾无效值截断逻辑存在差异。双精度浮点数的十进制有效位数天然为15~17位,这个区间的序列化刚好触及实现差异的边界,就会出现你看到的输出不一致问题。 - PostGIS/GEOS编译与版本差异
不同发行版打包的PostGIS、依赖的GEOS几何库版本可能存在区别,编译时的浮点优化开关(比如-mfpmath、-ffast-math参数配置)也会影响高精度场景下的浮点输出逻辑。 - Postgres小版本的内置处理调整
你使用的Postgres服务端版本分别为12.8和12.9,小版本迭代中也可能包含浮点类型序列化的逻辑调整,不过该原因的触发概率远低于前两类。
你限制精度到13位后输出一致是正常现象:13位小数完全处于双精度浮点数的可靠有效位数范围内,所有主流C标准库在该精度下的浮点序列化输出逻辑都是统一的,不会出现实现差异。如果要保证跨环境的回归测试结果一致,固定使用ST_AsText(geom, 13)及以下精度即可满足需求。
内容的提问来源于stack exchange,提问作者bend
相关产品推荐
相关产品推荐

