2015-09-26 43 views
0

我在定義爲DECIMAL(19,4)的MySQL表中有一個貨幣列。它不是一個浮點數,所以沒有精度損失的問題。在MySQL和PHP中使用貨幣

我的問題是我如何將它取到PHP中,操作它,並將它存儲回MySQL,而不會丟失精確度。默認情況下,如果我獲取並操作它,我相信它會變成一個浮點數。

我的假設是,我可以使用以下命令:

$price = $price * 100; 
$price = (int) $price; 
//do some manipulation here 
$price = $price/100; 
//store back into MySQL database 

工作的呢?

我也看過存儲爲一個整數,並使用BCMath,但我想知道如果上述將工作。

+3

您可能會考慮在數據庫中執行所有操作。 –

+0

與此相關的一個問題是我需要執行計算,然後要求用戶驗證他們是否要繼續。如果他們繼續,那麼我會將它添加到數據庫中。 – kojow7

+0

你能提供一個你正在嘗試做的實際算術的更好的例子嗎?在乘以100後,你應該沒有問題,除以100乘以100。 –

回答

0

這太長了評論。

對於「正常」貨幣和「正常」貨幣量,則雙精度/小數(19,4)是好的。 double的精度是15位數的精度。這是一個像這樣的值123,456,789,012,345。即使只是美分的一小部分,這相當準確地代表了高達1230億美元。小數和雙精度之間的轉換使用舍入應該沒問題。

換句話說,如果您使用的金額高達百萬貨幣單位,並且要求精度低至千分之一的單位,那麼雙精度應該沒問題。如果情況並非如此,則可能需要一個特殊的數學庫來處理算術。 (Postgres有一個內置的。)

有些情況下,這樣的範圍是不夠的。當土耳其里拉的交易價格超過1,000,000美元到1美元時,一個單位的1/1000的範圍只會低於100萬美元 - 這可能是不夠的。或者,如果您要對金融投資組合進行估值,特別是使用交易的名義價值,那麼該範圍可能不夠。

+0

關於上面的「使用四捨五入」,您是否建議不是乘數並轉換爲int,而是在數據庫出來時使用round($ product_price,2)?並且在它返回到數據庫之前循環($ inv_total,2)? – kojow7

+0

@ kojow7。 。 。基本上,是的。這應該工作,除非你的計算涉及複雜的計算或涉及數量與大小不同的數字。 –