2017-04-03 23 views
0

我是PG新手,想知道是否需要額外做任何事情來正確處理浮點數學。Postgres浮點數學 - 我需要做什麼特別的嗎?

例如,在紅寶石中使用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

您不需要轉換爲小數。 –

+0

你的數學沒有浮點數。 –

+0

'withdraw_percentage_discount'是一個像'0.10'這樣的浮點數。這沒有資格嗎? – Tallboy

回答

1

這取決於你想要什麼。

如果你想要浮點數你需要使用數據類型realdouble precision,這取決於你的精度要求。

這些浮點數需要一個固定的空間(4或8字節),以二進制表示形式存儲並且精度有限。

如果你想任意精度,可以使用二進制編碼的十進制numericdecimal是一個代名詞吧)。

此類值以十進制數字形式存儲,所需存儲量取決於數字位數。

浮點數的一大優點是性能–浮點運算是在處理器硬件中實現的,而二進制編碼的小數運算是在PostgreSQL中實現的。

經驗法則是:

  • 如果你需要是準確的達到一定的小數位數(如貨幣數據)值,你不需要做大量的計算,使用decimal

  • 如果您需要進行數字運算並且您不需要將值舍入到固定的精度,請使用double precision

+0

這是一個非常好的答案,謝謝。所以基本上浮點數學錯誤是不可能的,只要你使用'numeric',因爲它只是爲符號和指數或其他任何東西存儲一些額外的位(而用浮點數將它壓縮到特定的空間量)? – Tallboy

+0

好吧,如果你使用'numeric(7,2)',你會得到很多舍入誤差,但這就是你要求的那種情況。使用'numeric(200,100)',您將比'double precision'獲得更好的精度。對於浮點數據類型,您不能*配置*您的精度。 –

+0

對不起,我現在有點困惑。所以如果我將一個百分比存儲爲'0.10'或'1.00'或'0'。33'的意思是10%,100%,33%,我想確保我的計算對於123 *(1%)是準確的,其中123是任何整數(其數量以美分計) ,對於百分比數據類型使用'numeric(3,2)'是否安全? – Tallboy

相關問題