Java使用BigDecimal進(jìn)行運(yùn)算封裝的實(shí)際案例
日常對(duì)于金額計(jì)算,應(yīng)該都是用的BigDecimal
,可是苦于沒(méi)有好的工具類方法,現(xiàn)在貢獻(xiàn)一個(gè)我正在用的對(duì)于數(shù)字計(jì)算的工具類,項(xiàng)目中就是用的這個(gè),簡(jiǎn)單粗暴好用,話不多說(shuō),代碼奉上(該工具類需要引入google的一個(gè)jar,com.google.common.base.Optional
,具體maven
引入看文章末尾):
import java.math.BigDecimal; public class NumberArithmeticUtils { /** * BigDecimal的加法運(yùn)算封裝 * @param b1 * @param bn * @return */ public static BigDecimal safeAdd(BigDecimal b1, BigDecimal... bn) { if (null == b1) { b1 = BigDecimal.ZERO; } if (null != bn) { for (BigDecimal b : bn) { b1 = b1.add(null == b ? BigDecimal.ZERO : b); } } return b1; } /** * Integer加法運(yùn)算的封裝 * @param b1 第一個(gè)數(shù) * @param bn 需要加的加法數(shù)組 * @注 : Optional 是屬于com.google.common.base.Optional<T> 下面的class * @return */ public static Integer safeAdd(Integer b1, Integer... bn) { if (null == b1) { b1 = 0; } Integer r = b1; if (null != bn) { for (Integer b : bn) { r += Optional.fromNullable(b).or(0); } } return r > 0 ? r : 0; } /** * 計(jì)算金額方法 * @param b1 * @param bn * @return */ public static BigDecimal safeSubtract(BigDecimal b1, BigDecimal... bn) { return safeSubtract(true, b1, bn); } /** * BigDecimal的安全減法運(yùn)算 * @param isZero 減法結(jié)果為負(fù)數(shù)時(shí)是否返回0,true是返回0(金額計(jì)算時(shí)使用),false是返回負(fù)數(shù)結(jié)果 * @param b1 被減數(shù) * @param bn 需要減的減數(shù)數(shù)組 * @return */ public static BigDecimal safeSubtract(Boolean isZero, BigDecimal b1, BigDecimal... bn) { if (null == b1) { b1 = BigDecimal.ZERO; } BigDecimal r = b1; if (null != bn) { for (BigDecimal b : bn) { r = r.subtract((null == b ? BigDecimal.ZERO : b)); } } return isZero ? (r.compareTo(BigDecimal.ZERO) == -1 ? BigDecimal.ZERO : r) : r; } /** * 整型的減法運(yùn)算,小于0時(shí)返回0 * @param b1 * @param bn * @return */ public static Integer safeSubtract(Integer b1, Integer... bn) { if (null == b1) { b1 = 0; } Integer r = b1; if (null != bn) { for (Integer b : bn) { r -= Optional.fromNullable(b).or(0); } } return null != r && r > 0 ? r : 0; } /** * 金額除法計(jì)算,返回2位小數(shù)(具體的返回多少位大家自己看著改吧) * @param b1 * @param b2 * @return */ public static <T extends Number> BigDecimal safeDivide(T b1, T b2){ return safeDivide(b1, b2, BigDecimal.ZERO); } /** * BigDecimal的除法運(yùn)算封裝,如果除數(shù)或者被除數(shù)為0,返回默認(rèn)值 * 默認(rèn)返回小數(shù)位后2位,用于金額計(jì)算 * @param b1 * @param b2 * @param defaultValue * @return */ public static <T extends Number> BigDecimal safeDivide(T b1, T b2, BigDecimal defaultValue) { if (null == b1 || null == b2) { return defaultValue; } try { return BigDecimal.valueOf(b1.doubleValue()).divide(BigDecimal.valueOf(b2.doubleValue()), 2, BigDecimal.ROUND_HALF_UP); } catch (Exception e) { return defaultValue; } } /** * BigDecimal的乘法運(yùn)算封裝 * @param b1 * @param b2 * @return */ public static <T extends Number> BigDecimal safeMultiply(T b1, T b2) { if (null == b1 || null == b2) { return BigDecimal.ZERO; } return BigDecimal.valueOf(b1.doubleValue()).multiply(BigDecimal.valueOf(b2.doubleValue())).setScale(2, BigDecimal.ROUND_HALF_UP); } }
Optional所在的jar以及版本:guava-18.0.ar
pom.xml配置:
<!-- https://mvnrepository.com/artifact/com.google.guava/guava --> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>18.0</version> </dependency>
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
相關(guān)文章
springboot整合redis修改分區(qū)的操作流程
這篇文章主要介紹了springboot整合redis修改分區(qū)的操作流程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07SpringBoot配置SSL同時(shí)支持http和https訪問(wèn)實(shí)現(xiàn)
本文主要介紹了SpringBoot配置SSL同時(shí)支持http和https訪問(wèn)實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07基于Java隨機(jī)生成手機(jī)短信驗(yàn)證碼的實(shí)例代碼
這篇文章主要介紹了Java隨機(jī)生成手機(jī)短信驗(yàn)證碼的實(shí)例代碼,代碼分為哦簡(jiǎn)單版和復(fù)雜版,需要的朋友可以參考下2019-04-04IDEA使用SequenceDiagram插件繪制時(shí)序圖的方法
這篇文章主要介紹了IDEA使用SequenceDiagram插件繪制時(shí)序圖的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09Java實(shí)現(xiàn)的權(quán)重算法(按權(quán)重展現(xiàn)廣告)
這篇文章主要介紹了Java實(shí)現(xiàn)的權(quán)重算法(按權(quán)重展現(xiàn)廣告),本文講解了算法實(shí)現(xiàn)原理和實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-04-04java并發(fā)學(xué)習(xí)之BlockingQueue實(shí)現(xiàn)生產(chǎn)者消費(fèi)者詳解
這篇文章主要介紹了java并發(fā)學(xué)習(xí)之BlockingQueue實(shí)現(xiàn)生產(chǎn)者消費(fèi)者詳解,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11