如何使 postgresql SUM 在大量浮点数据上更准确?

Mil*_*vic 4 postgresql

我正在尝试REAL使用这样的简单查询对 800 万个浮点 ( ) 值求和:

SELECT SUM(metric) FROM metrics;
Run Code Online (Sandbox Code Playgroud)

但是,它返回的结果非常不准确。它应该返回 137,586.77,但它返回 137,303(283.77 差异)

有没有办法强制查询更精确?

Col*_*art 6

根据 REAL 数据类型http://www.postgresql.org/docs/9.2/static/datatype-numeric.html#DATATYPE-FLOAT的文档,它的精度为 6 位十进制数字。这就是你所看到的。如果您需要更高的精度,则需要使用 double 或具有固定精度的数字。

也许将实数转换为更精确的东西并总结结果会给你你需要的东西,例如:

SELECT SUM(metric::double) FROM metrics;
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!它有效,但我不得不使用`SELECT SUM(metric::DOUBLE PRECISION) FROM metrics;`,因为我的数据库不知道“double”类型。 (3认同)

Gur*_*uru 5

根据postgresql 文档

如果您需要精确的存储和计算(例如货币金额),请改用数字类型。

由于您使用了 real 数据类型,因此您可以将实际值转换为数字。然后你就可以得到你预期的结果。

SELECT SUM(metric::NUMERIC) FROM metrics;
Run Code Online (Sandbox Code Playgroud)