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