Java使用BigDecimal進(jìn)行運(yùn)算封裝的實(shí)際案例
日常對(duì)于金額計(jì)算,應(yīng)該都是用的BigDecimal,可是苦于沒(méi)有好的工具類(lèi)方法,現(xiàn)在貢獻(xiàn)一個(gè)我正在用的對(duì)于數(shù)字計(jì)算的工具類(lèi),項(xiàng)目中就是用的這個(gè),簡(jiǎn)單粗暴好用,話不多說(shuō),代碼奉上(該工具類(lèi)需要引入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)文章
在Java的Struts中判斷是否調(diào)用AJAX及用攔截器對(duì)其優(yōu)化
這篇文章主要介紹了在Java的Struts中判斷是否調(diào)用AJAX及用攔截器對(duì)其優(yōu)化的方法,Struts框架是Java的SSH三大web開(kāi)發(fā)框架之一,需要的朋友可以參考下2016-01-01
Springmvc中的轉(zhuǎn)發(fā)重定向和攔截器的示例
本篇文章主要介紹了Springmvc中的轉(zhuǎn)發(fā)重定向和攔截器的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05
Struts2 ActionContext 中的數(shù)據(jù)詳解
這篇文章主要介紹了Struts2 ActionContext 中的數(shù)據(jù)詳解,需要的朋友可以參考下2016-07-07
Mybatis-Plus進(jìn)階分頁(yè)與樂(lè)觀鎖插件及通用枚舉和多數(shù)據(jù)源詳解
這篇文章主要介紹了Mybatis-Plus的分頁(yè)插件與樂(lè)觀鎖插件還有通用枚舉和多數(shù)據(jù)源的相關(guān)介紹,文中代碼附有詳細(xì)的注釋?zhuān)信d趣的朋友來(lái)看看吧2022-03-03
java中的FileInputStream三種read()函數(shù)用法
這篇文章主要介紹了java中的FileInputStream三種read()函數(shù)用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
Java實(shí)現(xiàn)班級(jí)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)班級(jí)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
Java數(shù)據(jù)結(jié)構(gòu)之實(shí)現(xiàn)哈希表的分離鏈接法
今天給大家?guī)?lái)的是關(guān)于Java數(shù)據(jù)結(jié)構(gòu)的相關(guān)知識(shí),文章圍繞著Java哈希表的分離鏈接法展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06

