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

由于不可能简单地对十进制值进行四舍五入(小数精度问题(,因此您将不会得到完全为6.94e-9double值。四舍五入后,它将类似于6.9400000001e-9

你可以做:

演示:db<gt;小提琴

  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(),当然,它会返回类型text,而不是数字:

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

最新更新