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

如何處理JavaScript 中的貨幣值?

企業(yè)動(dòng)態(tài)
無(wú)論在銀行應(yīng)用程序、電子商務(wù)網(wǎng)站還是證券交易所平臺(tái),我們每天都在與金錢(qián)互動(dòng)。我們也越來(lái)越依賴(lài)技術(shù)來(lái)處理問(wèn)題。

金錢(qián)無(wú)處不在。

無(wú)論在銀行應(yīng)用程序、電子商務(wù)網(wǎng)站還是證券交易所平臺(tái),我們每天都在與金錢(qián)互動(dòng)。我們也越來(lái)越依賴(lài)技術(shù)來(lái)處理問(wèn)題。

然而,關(guān)于如何以編程處理貨幣價(jià)值尚無(wú)共識(shí)。雖然金錢(qián)是現(xiàn)代社會(huì)中普遍存在的概念,但相較于日期和時(shí)間之類(lèi)的東西,它并不是任何主流語(yǔ)言中的***數(shù)據(jù)類(lèi)型。結(jié)果,每一種軟件都有自己的處理方式,且伴隨著陷阱。

陷阱#1:金錢(qián)僅僅是數(shù)字?

當(dāng)你需要代表錢(qián)時(shí),你的***直覺(jué)可能是使用一個(gè)數(shù)字。

金錢(qián)只不過(guò)是一個(gè)數(shù)值,對(duì)吧?

錯(cuò)了。

貨幣價(jià)值的一部分與另一對(duì)象有關(guān):貨幣。沒(méi)有10“錢(qián)”,應(yīng)該是“10美元,10歐元,10比特幣”......如果你想用不同的貨幣添加兩個(gè)貨幣值,你需要先轉(zhuǎn)換它們。如果你想比較它們也是如此:如果你只有一個(gè)金額,你就無(wú)法進(jìn)行準(zhǔn)確的比較。金額和貨幣誰(shuí)也離不開(kāi)誰(shuí)。

陷阱#2:讓人煩惱的小數(shù)點(diǎn)

大多數(shù)現(xiàn)代貨幣額都是以小數(shù)形式出現(xiàn),或根本沒(méi)有子單位。這意味著當(dāng)貨幣有子單位時(shí),主單位中這些單位的數(shù)量是10的冪。例如,一美元有100美分——10的2次冪。

使用十進(jìn)制系統(tǒng)具有優(yōu)勢(shì),但在編程方面有一個(gè)問(wèn)題。計(jì)算機(jī)使用二進(jìn)制系統(tǒng),因此它們不能原生地表示十進(jìn)制數(shù)。有些語(yǔ)言提出了自己的解決方案,如Java中的BigDecimal類(lèi)型或C#中的小數(shù)類(lèi)型。JavaScript只有Number類(lèi)型,可以用作整數(shù)或雙精度浮點(diǎn)數(shù)。因?yàn)樗腔A(chǔ)10系統(tǒng)的二進(jìn)制表示,所以當(dāng)你嘗試進(jìn)行數(shù)學(xué)運(yùn)算時(shí),最終會(huì)得到不準(zhǔn)確的結(jié)果。

使用浮點(diǎn)來(lái)存儲(chǔ)貨幣價(jià)值是一個(gè)壞主意。

當(dāng)你計(jì)算更多值時(shí),難以察覺(jué)的精度誤差會(huì)導(dǎo)致更大的差異。這不可避免地導(dǎo)致最終的四舍五入問(wèn)題。

陷阱#3:百分比與分配

編程人員應(yīng)該怎么辦?

幸運(yùn)的是,軟件工程師Martin Fowler提出了一個(gè)解決方案。在企業(yè)應(yīng)用程序架構(gòu)模式中,他描述了貨幣價(jià)值的模式:

屬性

方法

數(shù)學(xué):加,減,乘,除

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

由此,你可以創(chuàng)建滿足大部分貨幣需求的價(jià)值對(duì)象。

“金額+貨幣”作為數(shù)據(jù)結(jié)構(gòu)

金錢(qián)的行為與簡(jiǎn)單的數(shù)字不同,因此應(yīng)區(qū)別對(duì)待。***個(gè)也是最重要的是:它應(yīng)該始終由金額和貨幣組成。

你可以將貨幣金額一起添加,檢查它們的值是否相對(duì)應(yīng),并將它們格式化為你需要的任何內(nèi)容。這可以通過(guò)對(duì)象的方法完成。在JavaScript中,任何返回對(duì)象的函數(shù)都可以解決問(wèn)題。

以分計(jì)額

有幾種方法可以解決JavaScript中的浮點(diǎn)問(wèn)題。

你可以使用像Decimal.js這樣的庫(kù)來(lái)將浮點(diǎn)數(shù)作為字符串。這不是一個(gè)糟糕的解決方案,當(dāng)你必須處理大數(shù)字時(shí),它會(huì)派上用場(chǎng)。然而,它以增重依賴(lài)性為代價(jià),導(dǎo)致性能降低。

你可以在計(jì)算之前將浮點(diǎn)數(shù)乘以整數(shù),然后將它們分開(kāi)。

 

這是一個(gè)很好的解決方案,但需要在對(duì)象構(gòu)造或每次操作時(shí)進(jìn)行額外的計(jì)算。這不一定會(huì)影響性能,但仍然需要更多的流程工作。

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

Dinero.js:一個(gè)用于創(chuàng)建、計(jì)算和格式貨幣價(jià)值的不可變庫(kù)

從以上觀察中,我創(chuàng)建了一個(gè)JavaScript庫(kù):Dinero.js。

 

Dinero.js遵循Fowler的模式更多一點(diǎn)兒。它允許你在JavaScript中創(chuàng)建、計(jì)算和格式化貨幣值。你可以進(jìn)行數(shù)學(xué)運(yùn)算、解析和格式化對(duì)象,甚至向他們提問(wèn),使你的開(kāi)發(fā)過(guò)程更加輕松。

該庫(kù)設(shè)計(jì)為不可變和可鏈接的模式。它支持全局設(shè)置,具有擴(kuò)展格式選項(xiàng),并提供本機(jī)國(guó)際化支持。

為什么不可變?

不可變庫(kù)更安全,更好預(yù)測(cè)。可變操作和引用副本是許多錯(cuò)誤的來(lái)源。選擇不變性能夠避免了這些錯(cuò)誤。

使用Dinero.js,你可以執(zhí)行計(jì)算而無(wú)需擔(dān)心更改原始用例。在以下Vue.js示例中,調(diào)用priceWithTax時(shí)不會(huì)更改Price。如果用例是可變的,它將會(huì)更改價(jià)格。

 

可鏈接性

優(yōu)秀的開(kāi)發(fā)人員努力使他們的代碼更簡(jiǎn)潔,更易于閱讀。當(dāng)你想要在單個(gè)對(duì)象上連續(xù)執(zhí)行多個(gè)操作時(shí),鏈接提供了優(yōu)雅的符號(hào)和簡(jiǎn)潔的語(yǔ)法。

 

全球設(shè)置

當(dāng)你處理大量貨幣價(jià)值時(shí),你可能希望其中一些人分享一些屬性。如果你使用德語(yǔ)制作網(wǎng)站,你可能希望以德國(guó)貨幣格式顯示金額。

這是全球設(shè)置派上用場(chǎng)的地方。你可以聲明將應(yīng)用于所有新對(duì)象的選項(xiàng),而不是將它們傳遞給每個(gè)用例。

 

原生國(guó)際化支持

傳統(tǒng)意義上,庫(kù)使用區(qū)域設(shè)置文件進(jìn)行國(guó)際化。

 

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

形成格式

對(duì)象很適合存儲(chǔ)數(shù)據(jù),但在顯示數(shù)據(jù)時(shí)卻沒(méi)那么有用。Dinero.js提供了各種格式化方法,包括toFormat。它為Number.prototype.toLocaleString提供了直觀而簡(jiǎn)潔的語(yǔ)法。將它與setLocale配對(duì),你將能夠以任何語(yǔ)言將任何Dinero對(duì)象顯示為正確的格式。這對(duì)多語(yǔ)言電子商務(wù)網(wǎng)站特別有用。

接下來(lái)做什么?

大家廣泛認(rèn)同F(xiàn)owler模式是一個(gè)不錯(cuò)的解決方案。它激發(fā)了許多語(yǔ)言的同步實(shí)現(xiàn)。如果你正在DIY,我推薦它和本文的觀察結(jié)果作為起點(diǎn)。或者你可以選擇Dinero.js:一種現(xiàn)代,可靠,經(jīng)過(guò)全面測(cè)試的解決方案,已經(jīng)可以使用。

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

【本文是51CTO專(zhuān)欄作者數(shù)據(jù)星河的原創(chuàng)文章,作者微信公眾號(hào)數(shù)據(jù)星河(ID:BDG-store)】

 

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

 

責(zé)任編輯:武曉燕 來(lái)源: 51CTO專(zhuān)欄
相關(guān)推薦

2017-10-26 08:43:18

JavaScript內(nèi)存處理

2023-03-09 12:21:38

2019-11-08 08:00:00

ASP .NETASP .NET Cocookie

2011-04-11 17:10:16

Oracle

2012-07-30 09:35:10

項(xiàng)目管理

2019-08-15 10:20:19

云計(jì)算技術(shù)安全

2021-03-24 10:40:26

Python垃圾語(yǔ)言

2021-08-18 08:20:14

SQL除數(shù)統(tǒng)計(jì)

2019-09-11 09:21:54

Facebook法定貨幣比特幣

2011-01-21 16:27:43

NagiosSendmail

2025-02-21 15:43:29

slotredis集群

2019-12-23 10:20:12

Web圖片優(yōu)化前端

2021-03-01 07:31:53

消息支付高可用

2023-04-06 15:19:51

2014-11-10 10:52:33

Go語(yǔ)言

2012-08-29 10:12:13

人才創(chuàng)業(yè)硅谷

2012-12-12 09:49:41

2020-12-29 09:11:33

LinuxLinux內(nèi)核

2017-03-13 13:21:34

Git處理大倉(cāng)庫(kù)

2011-12-15 12:32:19

JavaNIO
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 9porny九色视频自拍 | 狠狠涩| 国产精品日韩一区二区 | 午夜影院在线免费观看视频 | 欧美lesbianxxxxhd视频社区 | 国产99视频精品免费视频7 | www国产成人免费观看视频,深夜成人网 | 中文字幕人成乱码在线观看 | 亚洲欧美在线观看 | 日韩影音 | 黄免费看| 欧美综合视频 | 久久久久久久久久久丰满 | 中文字幕在线第一页 | 欧美激情精品久久久久久 | 国产精品精品久久久 | 日韩网站在线观看 | 午夜网 | 夜夜骚 | 欧美激情视频网站 | 精品欧美一区二区三区精品久久 | 国产高清自拍视频在线观看 | 欧美在线二区 | 四虎在线观看 | 日本中文字幕视频 | 精品久久久久久亚洲综合网 | 国产精品一区在线 | 日本一区不卡 | 亚洲一区在线播放 | 欧美激情在线一区二区三区 | 欧美日一区二区 | 国产高清精品一区二区三区 | 伦理午夜电影免费观看 | 欧美精品a∨在线观看不卡 欧美日韩中文字幕在线播放 | 国产在线观看免费 | 国产欧美一区二区三区国产幕精品 | 久久久免费电影 | 亚洲成人一区 | 精品国产31久久久久久 | 国产自产21区 | 高清免费av |