我在一个shapefile上执行了ST_Area,但得到的数字非常长。需要将它们减少到两位小数。这是迄今为止的代码:
SELECT mtn_name, ST_Area(geom) / 1000000 AS km2 FROM mountain ORDER BY 2 DESC;
这就是我得到的:
mtn_name KM2
character varying double precision
1 Monte del Pueblo de Jerez del Marquesado 6.9435657067528e-9
2 Monte de La Peza 6.113288075418532e-9
我试过ROUND((,但它使KM达到0.00
由于不可能简单地对十进制值进行四舍五入(小数精度问题(,因此您将不会得到完全为6.94e-9
的double
值。四舍五入后,它将类似于6.9400000001e-9
。
你可以做:
演示:db<gt;小提琴
-
如果指数始终相同(在您的示例中始终为
e-9
(,则可以使用固定值进行舍入。对于double
值,这导致了上述问题。SELECT round(area * 10e8 * 100) / 100 / 10e8 FROM area_result
-
为了避免这些精度问题,您可以使用
numeric
型SELECT round(area * 10e8 * 100)::numeric / 100 / 10e8 FROM area_result
如果你有不同的指数,你必须首先计算乘数。根据这个解决方案,你可以做:
-
对于
double
输出SELECT round(area / mul * 100) * mul / 100 FROM ( SELECT area, pow(10, floor(log10(area))) as mul FROM area_result ) s
-
对于
numeric
输出SELECT round((area / mul) * 100)::numeric * mul / 100 FROM ( SELECT area, pow(10, floor(log10(area)))::numeric as mul FROM area_result ) s
但是,您的指数结果只是值的一个视图。这可能因数据库工具而异。在内部,它们不作为视图存储。因此,如果您获取这些值,实际上,您将获得类似0.00000000694
的值,而不是6.94e-9
,后者只是一个文本表示。
-
如果您想确保获得准确的文本表示,您可以为此使用数字格式
to_char()
,当然,它会返回类型text
,而不是数字:SELECT to_char(area, '9.99EEEE') FROM area_result