使用 ST_Area 结果保留两位小数
Results to two decimals using ST_Area
我已经对 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
由于无法简单地将小数值四舍五入(小数精度问题),因此您不会得到 double
恰好 6.94e-9
的值。四舍五入后类似于 6.9400000001e-9
。
你可以这样做:
如果指数始终相同(在您的示例中它始终是 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()
,当然,returns一个类型text
,不再是数字:
SELECT
to_char(area, '9.99EEEE')
FROM area_result
我已经对 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
由于无法简单地将小数值四舍五入(小数精度问题),因此您不会得到 double
恰好 6.94e-9
的值。四舍五入后类似于 6.9400000001e-9
。
你可以这样做:
如果指数始终相同(在您的示例中它始终是
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()
,当然,returns一个类型text
,不再是数字:SELECT to_char(area, '9.99EEEE') FROM area_result