postgres round函数:特定查询中的意外行为

时间:2014-12-22 02:33:17

标签: postgresql postgis rounding

这个简单的postgres循环调用将数字舍入为3位小数,如预期的那样:

SELECT round(43.1235421,3);
 round  
--------
 43.124
(1 row)

但是,下面查询中完全相同的舍入操作会给我43.1240000000000023。该查询针对postgis数据库运行,以防万一。

(SELECT ogc_fid,wkb_geometry,round(43.1235421,3) AS lat FROM grid_1) AS "grid"

这种行为是不受欢迎的。我究竟做错了什么?如何按预期将浮点数四舍五入到小数点后3位?提前谢谢。

编辑:我尝试在postgis查询中明确地将float转换为数字,但结果相同。

(SELECT ogc_fid,wkb_geometry,round(43.1235421::numeric,3) AS lat FROM grid_1) AS "grid"

1 个答案:

答案 0 :(得分:1)

两者给出相同的答案,postgis只是在结果中给出了更多的小数位,其中一些是毫无价值的。浮点数很少精确,只有少数几个部分具有精确的二进制表示,0.2不是其中之一。如果将结果扩展到足够的位置,您将开始看到准确度。

如果你需要base-10 precision,请使用numeric而不是float。

如果你仍然想要花车,但想要隐藏丑陋的部分

 SET extra_float_digits TO 0;