2014-05-19 39 views
3

我有約10-15個數字,我的數據庫中有1,2或3位小數的精度,包括有符號和無符號。所使用的數據類型的我應該使用BCMath的值爲1,2或3位小數嗎?

例子:

decimal(10,3), decimal(10,2), decimal(10,1) 

我計算它們在PHP是這樣的:

$result = ($value1from_col1 + ($value2from_col2 * 30)/500) * 0.453; 

然後我用一些像這樣的round()功能:

$result_round = round($result, 2, PHP_ROUND_HALF_UP); 

$result_round的結果將是最大的:100.000,999

我檢查這個:How much precision for a bcmath PHP library? 和答案指出,如果你不使用的功能,如圓(),printf的等

我應該使用bcmath時擴展那就不會是一個問題? (只是因爲我使用的是round()

+0

你的整數有多大? – h2ooooooo

+0

@ h2ooooooo - 剛剛更新的問題。 – bestprogrammerintheworld

+0

@ Cagy79你引用的答案是關於整數,沒有分數,所以在這裏不適用 –

回答

3

一些常見的數字不能完全用二進制表示(通常,我的意思是它們經常出現在基於人的系統中,顯然本身就是一個無意義的概念)。例如,0.1,0.2。瞭解二進制fp的一些問題看看這個問題Why can't decimal numbers be represented exactly in binary?

對於很多常見的應用,二進制浮點是錯誤的選擇。例如,貨幣計算將是「錯誤的」,因爲我們希望人類以十進制計數到預定的小數位數(貨幣情況下爲2)。在財務計算中使用二進制fp導致的舍入誤差甚至可能是盜用的機會!

bcmath實現十進制FP,因此通常是更安全的選擇。

爲了測量真實世界的值,例如在科學實驗中,二元FP很好。

如果您認爲存儲的是固定數量的小數點,那麼您可能確實需要bcmath而不是標準的二進制浮點數。如果您使用的是bcmath,請檢查您的數據庫表示並使用十進制類型。

+0

因此,如果我理解你正確提供的鏈接,問題主要是當你想劃分(一些)不同的數字(具有精確的精度)? – bestprogrammerintheworld

+0

甚至可能會出錯,例如如果將足夠的0.1加在一起,並且由於該數字在二進制fp中無法表示,那麼它們全部出來,那麼最終您將超出0.01以上。 –

+0

好的。太感謝了! :-) – bestprogrammerintheworld

相關問題