狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

[點(diǎn)晴永久免費(fèi)OA]爭(zhēng)論不休:金額用Long還是BigDecimal?

freeflydom
2023年12月28日 10:46 本文熱度 873

問(wèn)題

今天在網(wǎng)上看到一個(gè)有意思的問(wèn)題,金額的數(shù)據(jù)類型用Long還是BigDecimal?

具體問(wèn)題大概是這樣的:關(guān)于金額的數(shù)據(jù)類型,組長(zhǎng)認(rèn)為使用BigDecimal比較穩(wěn)妥,總監(jiān)認(rèn)為使用Long才不會(huì)出問(wèn)題,然后開發(fā)認(rèn)為L(zhǎng)ong用起來(lái)比較爽。

從這兩個(gè)數(shù)據(jù)類型來(lái)看,這家公司使用的開發(fā)語(yǔ)言應(yīng)該是Java,不過(guò)換成其它開發(fā)語(yǔ)言,也有類似的數(shù)據(jù)類型選擇問(wèn)題,這是一個(gè)廣泛存在的問(wèn)題,所以可以和大家好好聊聊。

網(wǎng)友方案

針對(duì)這個(gè)問(wèn)題,熱情的網(wǎng)友們從各自的經(jīng)歷出發(fā),提供了很多方案。我大概總結(jié)了下,居然有十種之多,雖然有的像調(diào)侃,但都有一定的道理。相信大家也很好奇,所以這里我先分享下網(wǎng)友們的方案。

Long

解讀:?jiǎn)挝坏椒郑瑳](méi)有小數(shù)點(diǎn),也就沒(méi)有小數(shù)精度的問(wèn)題。而且Long取值范圍也足夠了。

BigDecimal

解讀:大家都這么用,BigDecimal就是為精確計(jì)算而生的。用long不專業(yè),適應(yīng)性不好。

Long和BigDecimal

解讀:成年人不做選擇,成年人什么都要。金額、價(jià)格這些用Long,匯率、費(fèi)率這些要求的小數(shù)點(diǎn)比較多,那就用BigDecimal。

String

解讀:萬(wàn)物皆可string。只是處理規(guī)則需要全部自己寫,高手必備的技能。

Protobuf

解讀:脫離框架講方案都是耍流氓。Protobuf里邊根本就沒(méi)有BigDecimal,雖然可以用string或者自定義類型來(lái)代表Java中的BigDecimal,不過(guò)性能可能要差那么一點(diǎn)點(diǎn)。

自定義

解讀:架構(gòu)師的好苗子。程序不是能跑起來(lái)、不出錯(cuò)就行了,要考慮設(shè)計(jì)能不能自然體現(xiàn)業(yè)務(wù)需求,好不好理解、擴(kuò)展和維護(hù)。

聽(tīng)領(lǐng)導(dǎo)的

解讀:霍金來(lái)了中國(guó)也得站起來(lái)敬酒。這根本不是技術(shù)問(wèn)題,一切聽(tīng)領(lǐng)導(dǎo)指示,但是也要做好自我保護(hù)。

問(wèn)AI

解讀:緊跟時(shí)代風(fēng)口。作為有追求的技術(shù)人,就應(yīng)該想著怎么偷懶怎么最快,先進(jìn)的生產(chǎn)力工具要用起來(lái),大語(yǔ)言模型回答這個(gè)問(wèn)題滴水不漏、手到擒來(lái),不信你試試!

節(jié)省型

解讀:節(jié)儉是美德。就幾百塊錢的貨,又不是航母和火箭,根本用不著Long,用int、short,甚至byte就能滿足。

莫名其妙

解讀:這個(gè)特定芯片是說(shuō)CPU的位寬不一樣嗎?比如16位、32位CPU加減乘除的結(jié)果可能不同。不懂,真不懂,完全不懂這條評(píng)論在說(shuō)什么問(wèn)題,請(qǐng)有經(jīng)驗(yàn)的大神幫解答下。

根本問(wèn)題

俗話說(shuō),結(jié)局問(wèn)題先得明確問(wèn)題。那么這到底是個(gè)什么問(wèn)題呢?歸根到底還是小數(shù)的精度問(wèn)題。

有時(shí)候是根本除不盡,比如10除以3;有時(shí)候是因?yàn)樾?shù)的表達(dá)問(wèn)題,編程語(yǔ)言中帶小數(shù)的數(shù)據(jù)類型一般是float和double,它們內(nèi)部使用科學(xué)計(jì)數(shù)法,轉(zhuǎn)換二進(jìn)制的時(shí)候有可能出現(xiàn)無(wú)限小數(shù)位的問(wèn)題,比如Javascript中的0.1+0.2算出來(lái)就不是0.3,因?yàn)楦↑c(diǎn)數(shù)無(wú)法精確的表達(dá)0.1。

所以為了避免此類問(wèn)題,大家想出來(lái)了各種各樣的方法。

其實(shí)使用Long和BigDecimal的本質(zhì)都是一樣的,都是避免使用浮點(diǎn)數(shù)進(jìn)行表達(dá),只是Long屬于隱式設(shè)定小數(shù)點(diǎn),BigDecimal屬于顯示設(shè)定小數(shù)點(diǎn)。

比如,使用Long表示價(jià)格時(shí),系統(tǒng)約定單位是分,那么9999就代表99.99元;而使用BigDecimal表示價(jià)格時(shí),則需要明確小數(shù)位 new BigDecimal("99.99")。

另外不管是Long還是BigDecaimal在進(jìn)行除法運(yùn)算時(shí),只要發(fā)生除不盡,就存在精度問(wèn)題。

解決方案

這里我做個(gè)總結(jié)。

在程序中處理金額時(shí),最佳實(shí)踐通常是使用類似BigDecimal的數(shù)據(jù)類型,因?yàn)樗峁┝司_的小數(shù)運(yùn)算能力,這對(duì)于財(cái)務(wù)計(jì)算來(lái)說(shuō)非常重要。使用BigDecimal可以避免因浮點(diǎn)數(shù)的精度問(wèn)題導(dǎo)致的計(jì)算誤差,這些誤差在金融應(yīng)用中可能會(huì)導(dǎo)致嚴(yán)重的問(wèn)題。

BigDecimal可以精確地表示和計(jì)算小數(shù),它允許你定義小數(shù)點(diǎn)后的精度,并且提供了一系列的舍入模式。這意味著當(dāng)你需要執(zhí)行加減乘除時(shí),可以控制舍入行為以符合金融計(jì)算的要求。

另一方面,雖然使用Long類型來(lái)表示金額(通常以分為單位)也是一種選擇,因?yàn)樗苊饬诵?shù)的使用,從而也能保證精確性。但是,這種方法在表示和處理小數(shù)時(shí)就不那么直觀,而且在需要進(jìn)行貨幣轉(zhuǎn)換或者涉及到小數(shù)的計(jì)算時(shí),你必須自己管理小數(shù)點(diǎn)的位置。

例如,如果使用Long表示金額,你需要記住金額是以分為單位還是以元為單位,而且在報(bào)告或用戶界面中顯示金額時(shí),通常需要將金額轉(zhuǎn)換為以元為單位的格式,這就需要額外的計(jì)算步驟。

所以,雖然Long類型也可以用來(lái)精確地表示金額,但是為了代碼的可讀性、易用性和減少手動(dòng)處理小數(shù)點(diǎn)的錯(cuò)誤,推薦使用BigDecimal來(lái)處理金額。這是一種更安全、更靈活的方法,尤其是在需要精確計(jì)算小數(shù)時(shí)。

其它使用string或者自定義類的方案,當(dāng)然也可以,只是需要更多的工作來(lái)完善數(shù)據(jù)處理的各種規(guī)則,容易出錯(cuò),也不規(guī)范,為什么不使用現(xiàn)成的BigDecimal呢?


作者:螢火架構(gòu)
鏈接:https://juejin.cn/post/7314928953193578505
來(lái)源:稀土掘金
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。



該文章在 2023/12/28 10:53:25 編輯過(guò)
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved