Postgres 浮点数学 - 我需要做任何特别的事情吗?

Tal*_*boy 1 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
Run Code Online (Sandbox Code Playgroud)

数据类型:

service_fee integer NOT NULL
withdraw_percentage_discount numeric(3,2) DEFAULT 0.0 NOT NULL
Run Code Online (Sandbox Code Playgroud)

Lau*_*lbe 5

这取决于你想要什么。

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

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

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

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

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

经验法则是:

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

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