[英]Currency Conversion for E-commerce site - Preventing incorrect Total Cart due to rounding
我正在為電子商務應用程序添加多種貨幣支持。 我解決問題的方法是將應用程序保留在它的基礎貨幣中,並讓模板在顯示價格時隨時調用priceDisplay()函數/插件。 因此模板繼續以美元金額收取價格。 priceDisplay函數在需要時正確轉換價格,並根據存儲在會話中的查看器設置添加正確的$或Euro符號。 在訂單提交時,應用程序將以美元金額以及currencyCode和currencyRate存儲訂單。 此外,我們將以其貨幣向客戶的信用卡收費,以確保他們按照訂單屏幕上顯示的內容收費。
現在我遇到的問題是在購物車中以及在結賬時顯示購物車總數。 例如,應用程序向模板發送要在購物車中顯示的價格:
小計:9.75
發貨:5.95
總計:15.70
模板獲取這些金額並在每個項目上調用priceDisplay函數。 如果貨幣匯率為1.1,那么我們會向用戶顯示:
小計:10.725 - > 10.73
發貨:6.545 - > 6.55
總數:17.27
您可以看到小計+發貨= 17.28,但轉換的總數是17.27。
所以我認為可以使用的幾個選項可以使用,但是並沒有想到:
如果它有任何區別,應用程序是PHP,模板是Smarty。
您還可以在添加購物車項目的行總計時看到相同的問題:
3項x 9.75每個= 29.25
轉化:
3件商品x 10.73(10.725)= 32.18(32.175)
但是3 x 10.73 = 32.19!= 32.18
我堅定地參加了一個陣營。 貨幣轉換是核心業務邏輯,屬於您的模型,而不是您的視圖。
此外,雖然錢看起來像浮點數,但事實並非如此。 無論你的基本單位是什么,錢都會以整數量換手。 例如,在美國,如果口香糖是10美分,我買10,那么我交易100便士10口香糖。 即使我從軟件角度給出一美元鈔票,最好將其計為100便士。
有關這方面的更多信息,請參閱Martin Fowler的“企業應用程序架構 模式”和“分析模式” 。 他詳細討論了所有問題並提供了很好的示例代碼。 您還可以在網上找到一些信息:
如果您需要會計工作,我也會與會計師交談。 通過改變費率,奇怪的費用和其他廢話,貨幣兌換往往很復雜,如果你從一開始就沒有把它弄好,你可以花很長時間追逐便士以使賬面保持平衡。
如果您根據轉換后的貨幣進行結算,則實際上您不應該在視圖邏輯中進行該計算。
個人而言,我只會將總金額,小計加到船舶金額上。 這顯然是最簡單的使用方法,沒有人會錯過額外的便士。
永遠不要使用浮點數來賺錢! 你無緣無故地讓自己進入一個受傷的世界。 由於PHP沒有小數定點類型,所以使用整數進行所有貨幣計算。 請參閱William的鏈接。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.