Postgres浮点数学 - 我需要做一些特别的事吗?

时间:2017-04-03 17:03:39

标签: postgresql floating-point decimal

我是PG的新手,我想知道我是否需要做任何事情'额外的,以正确处理浮点数学。

例如,在ruby中使用BigDecimal,在Elixir中使用Decimal

我所拥有的是PG的最佳解决方案吗?

SELECT
  COALESCE(SUM(active_service_fees.service_fee * (1::decimal - active_service_fees.withdraw_percentage_discount)), 0)
FROM active_service_fees

数据类型:

service_fee integer NOT NULL
withdraw_percentage_discount numeric(3,2) DEFAULT 0.0 NOT NULL

1 个答案:

答案 0 :(得分:1)

这取决于你想要什么。

如果您需要浮点数,则需要使用数据类型realdouble precision,具体取决于您的精度要求。

这些浮点数需要一个固定的空间(4或8个字节),以二进制表示形式存储,精度有限。

如果你想要任意精度,你可以使用二进制编码的十进制类型numericdecimal是它的同义词。)

这些值存储为十进制数字,所需的存储量取决于位数。

浮点数的一大优势是性能 - 浮点运算在处理器的硬件中实现,而二进制编码的小数运算在PostgreSQL中实现。

经验法则是:

  • 如果您需要精确到一定数量小数位(如货币数据)的值,并且您不需要进行大量计算,请使用decimal

  • 如果您需要进行数字运算,并且不需要舍入到固定精度的值,请使用double precision