一個(gè)Java中BigDecimal的問題記錄
題主今天在用 BigDecimal 進(jìn)行計(jì)算的時(shí)候,遇到一個(gè)問題,那就是不管怎么計(jì)算,最后得到的值都沒有變化,這里題主就有些疑惑了,用的也是推薦的API,先看代碼:
BigDecimal totalPay = new BigDecimal("0");
BigDecimal totalIncomeOfMaster = new BigDecimal("0");
BigDecimal totalIncomeOfLB = new BigDecimal("0");
BigDecimal totalRebate = new BigDecimal("0");
if (CollectionUtils.isNotEmpty(rebateDetailVOS.getList())) {
for (RebateDetailVO rebateDetailVO : rebateDetailVOS.getList()) {
totalPay.add(rebateDetailVO.getFinalPayOfUser());
totalIncomeOfMaster.add(rebateDetailVO.getFinalIncomeOfMaster());
totalIncomeOfLB.add(rebateDetailVO.getFinalIncomeOfLB());
totalRebate.add(rebateDetailVO.getRebateAmt());
}
}
初次觀察,這份代碼沒有問題,但是運(yùn)行之后的結(jié)果沒有達(dá)到預(yù)期,于是題主進(jìn)入add()方法內(nèi)部觀看了一下源碼:

問題就出在這里,這里會(huì)返回一個(gè)new BigDecimal 對(duì)象,所以求和的值并不會(huì)被記錄。
然后題主就對(duì)代碼進(jìn)行修改:
BigDecimal totalPay = new BigDecimal("0");
BigDecimal totalIncomeOfMaster = new BigDecimal("0");
BigDecimal totalIncomeOfLB = new BigDecimal("0");
BigDecimal totalRebate = new BigDecimal("0");
if (CollectionUtils.isNotEmpty(rebateDetailVOS.getList())) {
for (RebateDetailVO rebateDetailVO : rebateDetailVOS.getList()) {
totalPay = totalPay.add(rebateDetailVO.getFinalPayOfUser());
totalIncomeOfMaster = totalIncomeOfMaster.add(rebateDetailVO.getFinalIncomeOfMaster());
totalIncomeOfLB = totalIncomeOfLB.add(rebateDetailVO.getFinalIncomeOfLB());
totalRebate = totalRebate.add(rebateDetailVO.getRebateAmt());
}
}
結(jié)果達(dá)到預(yù)期
附:Java中 BigDecimal 值小數(shù)點(diǎn)后的最大位數(shù)是多少?
解決方案
這幾乎是無限的。如果將scale設(shè)置為整數(shù)的最大值,則可以在小數(shù)點(diǎn)后存儲(chǔ)大約20億個(gè)數(shù)字,但如果嘗試執(zhí)行此操作,可能會(huì)耗盡內(nèi)存。如果您需要存儲(chǔ)這么多的數(shù)字以確定限制是一個(gè)問題,那么您可能需要重新考慮程序的設(shè)計(jì)。
參見 BigDecimal文檔:
不可變,任意精度的帶符號(hào)十進(jìn)制數(shù)。 BigDecimal由任意精度整數(shù)非標(biāo)度值和32位整數(shù)標(biāo)度組成。如果為零或正數(shù),則比例是小數(shù)點(diǎn)右側(cè)的位數(shù)。如果是負(fù)數(shù),則將數(shù)字的未縮放值乘以10來表示比例的否定。因此,BigDecimal表示的數(shù)字的值是(unscaledValue×10 -scale )。
總結(jié)
到此這篇關(guān)于Java中一個(gè)BigDecimal問題的文章就介紹到這了,更多相關(guān)Java BigDecimal問題內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot實(shí)現(xiàn)跨域的幾種常用方式總結(jié)
跨域是指一個(gè)域下的文檔或腳本試圖去請(qǐng)求另一個(gè)域下的資源,或者涉及到兩個(gè)不同域名的資源之間的交互,由于同源策略(Same Origin Policy)的限制,瀏覽器不允許跨域請(qǐng)求,本文小編給大家分享了SpringBoot實(shí)現(xiàn)跨域的幾種常用方式,需要的朋友可以參考下2023-09-09
Java String類詳解_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Java String類詳解,本文經(jīng)多方資料的收集整理和歸納,最終撰寫成文,非常不錯(cuò),值得收藏,需要的的朋友參考下2017-04-04
在springboot中注入FilterRegistrationBean不生效的原因
這篇文章主要介紹了在springboot中注入FilterRegistrationBean不生效的原因及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
java8如何根據(jù)某一屬性條件快速篩選list中的集合
這篇文章主要介紹了java8如何根據(jù)某一屬性條件快速篩選list中的集合,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01
java 判斷一個(gè)數(shù)組中的數(shù)值是否連續(xù)相鄰的方法
下面小編就為大家分享一篇java 判斷一個(gè)數(shù)組中的數(shù)值是否連續(xù)相鄰的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-03-03

