我是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
答案 0 :(得分:1)
这取决于你想要什么。
如果您需要浮点数,则需要使用数据类型real
或double precision
,具体取决于您的精度要求。
这些浮点数需要一个固定的空间(4或8个字节),以二进制表示形式存储,精度有限。
如果你想要任意精度,你可以使用二进制编码的十进制类型numeric
(decimal
是它的同义词。)
这些值存储为十进制数字,所需的存储量取决于位数。
浮点数的一大优势是性能 - 浮点运算在处理器的硬件中实现,而二进制编码的小数运算在PostgreSQL中实现。
经验法则是:
如果您需要精确到一定数量小数位(如货币数据)的值,并且您不需要进行大量计算,请使用decimal
。
如果您需要进行数字运算,并且不需要舍入到固定精度的值,请使用double precision
。