2009-05-23 29 views
8

我正在研究一些需要對某些貨幣值做一些基本計算的報告輸出腳本。如何在PHP中安全執行與貨幣相關的計算?

我知道浮點運算的侷限性,但輸入值都是十進制格式,所以如果我對它們使用算術運算符,PHP會將它們轉換爲浮點數。

那麼處理數字的最佳方法是什麼?我應該使用BCMath嗎?在.NET中是否有類似於Decimal的東西?或者,如果我將其轉換回int,是否可以安全地使用算術運算符?

+0

這就是爲什麼Cobol仍然在金融領域大量使用的原因。您可以輕鬆使用小數數字。 – 2009-05-23 03:09:34

回答

10

不要以美元工作(1.54美元),工作美分:(154c)。除非你需要執行幾分之一分重要的任務,否則你將使用整數並且一切都很好。如果你對十分之一美分感興趣,那就把所有東西都乘以十!

+9

概括:使用原子爲您貨幣的單位。 – SingleNegationElimination 2009-05-23 02:53:18

+0

要轉換貨幣,銀行向我們提供8位小數的匯率。 – 2009-05-23 03:07:14

8

如果您使用BCMath,則所有值都將存儲在字符串中並作爲字符串傳遞給函數,就像結果將是字符串一樣。所以,你不需要進行任何轉換,但要確保賦給函數的數字是一個數值數值。就個人而言,如果數學要求小數點的高精度,然後使用BCMath。

-4

如果你正在使用合理的數量(對「正常人」),使用浮點數不太可能是一個問題,特別是如果你只是增加和減少數量,而不是做興趣,比如興趣計算。

如果你正在尋找一個快速修復,切換到整數不可能幫助你;你仍然必須處理溢出。 (有人在這裏編輯提到,如果PHP遇到一個超出整數類型範圍的數字,它將是interpreted as a float instead。但是,然後你回到你原來使用浮點的問題!)任意長度整數(GMP,頁)可以幫助。)

基本上,這樣做在半途而廢的方式在大多數情況下工作,並且便宜;正確地做它是一個嚴重的痛苦。我的建議是把這看作是一個商業問題:如果有人抱怨錯過了一分錢,給他們一美元,並且不要開始真正的解決方案,直到你要通過這樣做來節省更多的美元。