一個(gè)Java中BigDecimal的問(wèn)題記錄
題主今天在用 BigDecimal 進(jìn)行計(jì)算的時(shí)候,遇到一個(gè)問(wèn)題,那就是不管怎么計(jì)算,最后得到的值都沒(méi)有變化,這里題主就有些疑惑了,用的也是推薦的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()); } }
初次觀察,這份代碼沒(méi)有問(wèn)題,但是運(yùn)行之后的結(jié)果沒(méi)有達(dá)到預(yù)期,于是題主進(jìn)入add()方法內(nèi)部觀看了一下源碼:
問(wèn)題就出在這里,這里會(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ù)是多少?
解決方案
這幾乎是無(wú)限的。如果將scale設(shè)置為整數(shù)的最大值,則可以在小數(shù)點(diǎn)后存儲(chǔ)大約20億個(gè)數(shù)字,但如果嘗試執(zhí)行此操作,可能會(huì)耗盡內(nèi)存。如果您需要存儲(chǔ)這么多的數(shù)字以確定限制是一個(gè)問(wèn)題,那么您可能需要重新考慮程序的設(shè)計(jì)。
參見(jiàn) BigDecimal文檔:
不可變,任意精度的帶符號(hào)十進(jìn)制數(shù)。 BigDecimal由任意精度整數(shù)非標(biāo)度值和32位整數(shù)標(biāo)度組成。如果為零或正數(shù),則比例是小數(shù)點(diǎn)右側(cè)的位數(shù)。如果是負(fù)數(shù),則將數(shù)字的未縮放值乘以10來(lái)表示比例的否定。因此,BigDecimal表示的數(shù)字的值是(unscaledValue×10 -scale )。
總結(jié)
到此這篇關(guān)于Java中一個(gè)BigDecimal問(wèn)題的文章就介紹到這了,更多相關(guān)Java BigDecimal問(wèn)題內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot事務(wù)使用及回滾實(shí)現(xiàn)代碼詳解
這篇文章主要介紹了SpringBoot事務(wù)使用及回滾實(shí)現(xiàn)代碼詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08實(shí)例講解Java讀取一般文本文件和word文檔的方法
讀取一般文本文件很好辦,調(diào)用Java自帶的io包里的類(lèi)即可,富文本的doc文件我們可以用Apache的poi項(xiàng)目中的WordExtractor,這里我們一起來(lái)以實(shí)例講解Java讀取一般文本文件和word文檔的方法2016-06-06Spring ApplicationContextAware 接口的作用及使用方式
Spring提供了許多回調(diào)接口,用于Bean生命周期中執(zhí)行特定的操作,通過(guò)實(shí)現(xiàn)ApplicationContextAware接口,Spring提供了一種便捷的方式讓 Bean獲取對(duì)Spring容器的引用,本文介紹ApplicationContextAware接口的作用、使用方式,以及在實(shí)際應(yīng)用中的常見(jiàn)場(chǎng)景,感興趣的朋友一起看看吧2024-01-01Java實(shí)現(xiàn)定時(shí)任務(wù)的方法詳解
大家都用過(guò)鬧鐘,鬧鐘可以說(shuō)是一種定時(shí)任務(wù)。那么,在?Java?中,如何實(shí)現(xiàn)這樣的功能呢?即如何實(shí)現(xiàn)定時(shí)任務(wù)呢?本文就來(lái)詳細(xì)和大家聊聊2022-10-10java使用FFmpeg提取音頻的實(shí)現(xiàn)示例
在Java開(kāi)發(fā)中,我們經(jīng)常會(huì)遇到需要使用FFmpeg來(lái)處理音視頻文件的情況,本文主要介紹了java使用FFmpeg提取音頻的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01SpringCloud客戶(hù)端的負(fù)載均衡Ribbon的實(shí)現(xiàn)
微服務(wù)架構(gòu),不可避免的存在單個(gè)微服務(wù)有多個(gè)實(shí)例,這篇文章主要介紹了SpringCloud客戶(hù)端的負(fù)載均衡Ribbon的實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-06-06實(shí)戰(zhàn)分布式醫(yī)療掛號(hào)系統(tǒng)之設(shè)置微服務(wù)搭建醫(yī)院模塊
這篇文章主要為大家介紹了實(shí)戰(zhàn)分布式醫(yī)療掛號(hào)系統(tǒng)之搭建醫(yī)院設(shè)置微服務(wù)模塊,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04Java計(jì)算一個(gè)數(shù)加上100是完全平方數(shù),加上168還是完全平方數(shù)
這篇文章主要介紹了Java計(jì)算一個(gè)數(shù)加上100是完全平方數(shù),加上168還是完全平方數(shù),需要的朋友可以參考下2017-02-02Kotlin + Retrofit + RxJava簡(jiǎn)單封裝使用詳解
這篇文章主要介紹了Kotlin + Retrofit + RxJava簡(jiǎn)單封裝使用詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-07-07