使用 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

你可以这样做:

demos:db<>fiddle

  1. 如果指数始终相同(在您的示例中它始终是 e-9),您可以使用固定值四舍五入。对于 double 值,这会导致上述问题。

    SELECT
        round(area * 10e8 * 100) / 100 / 10e8
    FROM area_result
    
  2. 为了避免这些精度问题,你可以使用numeric类型

    SELECT
        round(area * 10e8 * 100)::numeric / 100 / 10e8
    FROM area_result
    

如果你有不同的指数,你必须先计算乘数。根据你可以这样做:

  1. 对于double输出

    SELECT
        round(area / mul * 100) * mul / 100
    FROM (
        SELECT
            area,
            pow(10, floor(log10(area))) as mul
        FROM area_result
    ) s
    
  2. 对于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 的值,这只是文本表示。

  1. 如果你想确保准确地得到这个文本表示,你可以使用数字格式to_char(),当然,returns一个类型text,不再是数字:

    SELECT
        to_char(area, '9.99EEEE')
    FROM area_result