2012-01-13 167 views
3

正如通常所討論的(例如,這裏是Storing 0.00001 in MySQL),DECIMAL數據類型應該用於需要精度/正確性的字段,例如賬戶餘額。PHP中的PHP DECIMAL處理

但是我想知道PHP如何處理這些值,如果它們在內部作爲浮動處理,如果從數據庫中讀取這些值時仍存在問題,請執行一些計算並將其重新寫回。如果是這樣,我們如何強制PHP保持精確度?

+0

我們現在在將MySQL查詢輸入數據庫時​​執行所有計算。一些不精確性仍然存在,所以也許這個問題在別的地方,但這是我猜想的另一個問題。 – 2012-01-24 10:40:23

回答

3

該變量可能是一個最初在PHP中的字符串(當從MySQL結果對象讀取時)。一般來說,不能依賴PHP的浮點數據類型來保持所需的精確十進制值。你應該使用任意精度的數學庫,如GMP。 (當您獲取結果對象的一行時,將DECIMAL列值傳遞給相應的構造函數,然後使用您使用的庫提供的函數對其進行操作。)

要更深入:假設您在DECIMAL(6, 4)列中存儲了數據庫中的金額。你想把它轉換成PHP,並用它來做一些事情。您發出一個查詢來獲取該列。您將查詢的第一行提取到關聯數組中。假設該行的值是2.5674。你的數組現在就像array('MyDecimal' => '2.5674')(數字顯示爲一個字符串)。您可以使用(據我所知)將該字符串轉換爲GMP資源。現在,您可以使用其他GMP功能對該數字進行數學運算。如果要存儲GMP編號,可以使用gmp_strval()將其轉換回字符串(如果您使用的是可以處理GMP資源的數據庫抽象層,則不必這樣做)。