成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何處理JavaScript 中的貨幣值?

企業動態
無論在銀行應用程序、電子商務網站還是證券交易所平臺,我們每天都在與金錢互動。我們也越來越依賴技術來處理問題。

金錢無處不在。

無論在銀行應用程序、電子商務網站還是證券交易所平臺,我們每天都在與金錢互動。我們也越來越依賴技術來處理問題。

然而,關于如何以編程處理貨幣價值尚無共識。雖然金錢是現代社會中普遍存在的概念,但相較于日期和時間之類的東西,它并不是任何主流語言中的***數據類型。結果,每一種軟件都有自己的處理方式,且伴隨著陷阱。

陷阱#1:金錢僅僅是數字?

當你需要代表錢時,你的***直覺可能是使用一個數字。

金錢只不過是一個數值,對吧?

錯了。

貨幣價值的一部分與另一對象有關:貨幣。沒有10“錢”,應該是“10美元,10歐元,10比特幣”......如果你想用不同的貨幣添加兩個貨幣值,你需要先轉換它們。如果你想比較它們也是如此:如果你只有一個金額,你就無法進行準確的比較。金額和貨幣誰也離不開誰。

陷阱#2:讓人煩惱的小數點

大多數現代貨幣額都是以小數形式出現,或根本沒有子單位。這意味著當貨幣有子單位時,主單位中這些單位的數量是10的冪。例如,一美元有100美分——10的2次冪。

使用十進制系統具有優勢,但在編程方面有一個問題。計算機使用二進制系統,因此它們不能原生地表示十進制數。有些語言提出了自己的解決方案,如Java中的BigDecimal類型或C#中的小數類型。JavaScript只有Number類型,可以用作整數或雙精度浮點數。因為它是基礎10系統的二進制表示,所以當你嘗試進行數學運算時,最終會得到不準確的結果。

使用浮點來存儲貨幣價值是一個壞主意。

當你計算更多值時,難以察覺的精度誤差會導致更大的差異。這不可避免地導致最終的四舍五入問題。

陷阱#3:百分比與分配

編程人員應該怎么辦?

幸運的是,軟件工程師Martin Fowler提出了一個解決方案。在企業應用程序架構模式中,他描述了貨幣價值的模式:

屬性

方法

數學:加,減,乘,除

比較:等于,大于,大于或等于,小于,小于或等于。

由此,你可以創建滿足大部分貨幣需求的價值對象。

“金額+貨幣”作為數據結構

金錢的行為與簡單的數字不同,因此應區別對待。***個也是最重要的是:它應該始終由金額和貨幣組成。

你可以將貨幣金額一起添加,檢查它們的值是否相對應,并將它們格式化為你需要的任何內容。這可以通過對象的方法完成。在JavaScript中,任何返回對象的函數都可以解決問題。

以分計額

有幾種方法可以解決JavaScript中的浮點問題。

你可以使用像Decimal.js這樣的庫來將浮點數作為字符串。這不是一個糟糕的解決方案,當你必須處理大數字時,它會派上用場。然而,它以增重依賴性為代價,導致性能降低。

你可以在計算之前將浮點數乘以整數,然后將它們分開。

 

這是一個很好的解決方案,但需要在對象構造或每次操作時進行額外的計算。這不一定會影響性能,但仍然需要更多的流程工作。

第三種方法是直接以美分為單位存儲相對于單位的值。如果你需要存儲10美分,則不會存儲0.1,而是10.這允許你僅使用整數,這意味著安全計算(直到你遇到大數字)和出色的性能。

Dinero.js:一個用于創建、計算和格式貨幣價值的不可變庫

從以上觀察中,我創建了一個JavaScript庫:Dinero.js。

 

Dinero.js遵循Fowler的模式更多一點兒。它允許你在JavaScript中創建、計算和格式化貨幣值。你可以進行數學運算、解析和格式化對象,甚至向他們提問,使你的開發過程更加輕松。

該庫設計為不可變和可鏈接的模式。它支持全局設置,具有擴展格式選項,并提供本機國際化支持。

為什么不可變?

不可變庫更安全,更好預測。可變操作和引用副本是許多錯誤的來源。選擇不變性能夠避免了這些錯誤。

使用Dinero.js,你可以執行計算而無需擔心更改原始用例。在以下Vue.js示例中,調用priceWithTax時不會更改Price。如果用例是可變的,它將會更改價格。

 

可鏈接性

優秀的開發人員努力使他們的代碼更簡潔,更易于閱讀。當你想要在單個對象上連續執行多個操作時,鏈接提供了優雅的符號和簡潔的語法。

 

全球設置

當你處理大量貨幣價值時,你可能希望其中一些人分享一些屬性。如果你使用德語制作網站,你可能希望以德國貨幣格式顯示金額。

這是全球設置派上用場的地方。你可以聲明將應用于所有新對象的選項,而不是將它們傳遞給每個用例。

 

原生國際化支持

傳統意義上,庫使用區域設置文件進行國際化。

 

區域設置文件也很難維護。 Internationalization API是原生的,并且得到了很不錯的支持。除非你必須使用過時的或不知名的瀏覽器,否則toFormat可以安全使用。

形成格式

對象很適合存儲數據,但在顯示數據時卻沒那么有用。Dinero.js提供了各種格式化方法,包括toFormat。它為Number.prototype.toLocaleString提供了直觀而簡潔的語法。將它與setLocale配對,你將能夠以任何語言將任何Dinero對象顯示為正確的格式。這對多語言電子商務網站特別有用。

接下來做什么?

大家廣泛認同Fowler模式是一個不錯的解決方案。它激發了許多語言的同步實現。如果你正在DIY,我推薦它和本文的觀察結果作為起點。或者你可以選擇Dinero.js:一種現代,可靠,經過全面測試的解決方案,已經可以使用。

本文譯自Medium上Sarah Dayan的博文:https://medium.freecodecamp.org/how-to-handle-monetary-values-in-javascript-3fef5eeb3eda

【本文是51CTO專欄作者數據星河的原創文章,作者微信公眾號數據星河(ID:BDG-store)】

 

戳這里,看該作者更多好文

 

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2017-10-26 08:43:18

JavaScript內存處理

2023-03-09 12:21:38

2011-04-11 17:10:16

Oracle

2019-11-08 08:00:00

ASP .NETASP .NET Cocookie

2021-08-18 08:20:14

SQL除數統計

2012-07-30 09:35:10

項目管理

2025-02-21 15:43:29

slotredis集群

2019-08-15 10:20:19

云計算技術安全

2021-03-24 10:40:26

Python垃圾語言

2019-09-11 09:21:54

Facebook法定貨幣比特幣

2012-12-12 09:49:41

2020-12-29 09:11:33

LinuxLinux內核

2017-03-13 13:21:34

Git處理大倉庫

2011-12-15 12:32:19

JavaNIO

2011-01-21 16:27:43

NagiosSendmail

2021-02-02 07:52:02

CSS短內容長內容

2019-02-25 08:35:22

機器學習數據模型

2011-03-21 12:41:41

JavaScript

2019-12-23 10:20:12

Web圖片優化前端

2021-03-01 07:31:53

消息支付高可用
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 男人的天堂中文字幕 | 欧洲亚洲一区二区三区 | 久久噜噜噜精品国产亚洲综合 | 亚洲三级在线 | 久久久精品久久 | 啪视频在线 | 亚洲精彩视频在线观看 | 亚洲精品国产电影 | 成人综合在线视频 | 久久久久99| 黄色一级电影免费观看 | 欧美日韩三级在线观看 | 99久久免费精品视频 | 天天舔天天| www.99热这里只有精品 | 日本高清视频在线播放 | 久久久久一区二区三区 | 中文字幕高清 | 成人在线观看网站 | 一级片免费在线观看 | 久久久成人一区二区免费影院 | 亚洲精品大全 | 欧美日韩1区2区3区 欧美久久一区 | 免费人成激情视频在线观看冫 | 一级毛片成人免费看a | wwwxxx日本在线观看 | 免费视频二区 | 337p日韩| 久久国| www.com久久久 | 亚洲综合婷婷 | 国产成人网 | 男人的天堂在线视频 | 欧美精品在线观看 | 久草视频在线播放 | 正在播放国产精品 | 欧美成人猛片aaaaaaa | 日韩男人天堂 | 中文字幕免费视频 | 亚洲成av人影片在线观看 | 欧美色视频免费 |