最全bigdecimal加减乘除运算封装

发布时间:2022-07-24 02:17:02 作者:thomas.lee 阅读量:8764

日常对于金额计算,应该都是用的BigDecimal,  可是苦于没有好的工具类方法,现在贡献一个我正在用的对于数字计算的工具类,项目中就是用的这个,简单粗暴好用,话不多说,代码奉上(该工具类需要引入google的一个jar  ,com.google.common.base.Optional,具体maven引入看文章末尾):

[java] view plain copy

  1. import java.math.BigDecimal;  

  2.   

  3. public class NumberArithmeticUtils {  

  4.       

  5.       

  6.     /** 

  7.      * BigDecimal的加法运算封装 

  8.      * @author : shijing 

  9.      * 2017年3月23日下午4:53:21 

  10.      * @param b1 

  11.      * @param bn 

  12.      * @return 

  13.      */  

  14.    public static BigDecimal safeAdd(BigDecimal b1, BigDecimal... bn) {  

  15.        if (null == b1) {  

  16.            b1 = BigDecimal.ZERO;  

  17.        }  

  18.        if (null != bn) {  

  19.            for (BigDecimal b : bn) {  

  20.                b1 = b1.add(null == b ? BigDecimal.ZERO : b);  

  21.            }  

  22.        }  

  23.        return b1;  

  24.    }  

  25.   

  26.    /** 

  27.     * Integer加法运算的封装 

  28.     * @author : shijing 

  29.     * 2017年3月23日下午4:54:08 

  30.     * @param b1   第一个数 

  31.     * @param bn   需要加的加法数组 

  32.     * @注 : Optional  是属于com.google.common.base.Optional<T> 下面的class 

  33.     * @return 

  34.     */  

  35.    public static Integer safeAdd(Integer b1, Integer... bn) {  

  36.        if (null == b1) {  

  37.            b1 = 0;  

  38.        }  

  39.        Integer r = b1;  

  40.        if (null != bn) {  

  41.            for (Integer b : bn) {  

  42.                r += Optional.fromNullable(b).or(0);  

  43.            }  

  44.        }  

  45.        return r > 0 ? r : 0;  

  46.    }  

  47.   

  48.    /** 

  49.     * 计算金额方法 

  50.     * @author : shijing 

  51.     * 2017年3月23日下午4:53:00 

  52.     * @param b1 

  53.     * @param bn 

  54.     * @return 

  55.     */  

  56.    public static BigDecimal safeSubtract(BigDecimal b1, BigDecimal... bn) {  

  57.        return safeSubtract(true, b1, bn);  

  58.    }  

  59.   

  60.    /** 

  61.     * BigDecimal的安全减法运算 

  62.     * @author : shijing 

  63.     * 2017年3月23日下午4:50:45 

  64.     * @param isZero  减法结果为负数时是否返回0,true是返回0(金额计算时使用),false是返回负数结果 

  65.     * @param b1        被减数 

  66.     * @param bn        需要减的减数数组 

  67.     * @return 

  68.     */  

  69.    public static BigDecimal safeSubtract(Boolean isZero, BigDecimal b1, BigDecimal... bn) {  

  70.        if (null == b1) {  

  71.            b1 = BigDecimal.ZERO;  

  72.        }  

  73.        BigDecimal r = b1;  

  74.        if (null != bn) {  

  75.            for (BigDecimal b : bn) {  

  76.                r = r.subtract((null == b ? BigDecimal.ZERO : b));  

  77.            }  

  78.        }  

  79.        return isZero ? (r.compareTo(BigDecimal.ZERO) == -1 ? BigDecimal.ZERO : r) : r;  

  80.    }  

  81.   

  82.    /** 

  83.     * 整型的减法运算,小于0时返回0 

  84.     * @author : shijing 

  85.     * 2017年3月23日下午4:58:16 

  86.     * @param b1 

  87.     * @param bn 

  88.     * @return 

  89.     */  

  90.    public static Integer safeSubtract(Integer b1, Integer... bn) {  

  91.        if (null == b1) {  

  92.            b1 = 0;  

  93.        }  

  94.        Integer r = b1;  

  95.        if (null != bn) {  

  96.            for (Integer b : bn) {  

  97.                r -= Optional.fromNullable(b).or(0);  

  98.            }  

  99.        }  

  100.        return  != r && r > 0 ? r : 0;  

  101.    }  

  102.   

  103.    /** 

  104.     * 金额除法计算,返回2位小数(具体的返回多少位大家自己看着改吧) 

  105.     * @author : shijing 

  106.     * 2017年3月23日下午5:02:17 

  107.     * @param b1 

  108.     * @param b2 

  109.     * @return 

  110.     */  

  111.    public static <T extends Number> BigDecimal safeDivide(T b1, T b2){  

  112.        return safeDivide(b1, b2, BigDecimal.ZERO);  

  113.    }  

  114.   

  115.    /** 

  116.     * BigDecimal的除法运算封装,如果除数或者被除数为0,返回默认值 

  117.     * 默认返回小数位后2位,用于金额计算 

  118.     * @author : shijing 

  119.     * 2017年3月23日下午4:59:29 

  120.     * @param b1 

  121.     * @param b2 

  122.     * @param defaultValue 

  123.     * @return 

  124.     */  

  125.    public static <T extends Number> BigDecimal safeDivide(T b1, T b2, BigDecimal defaultValue) {  

  126.        if (null == b1 ||  null == b2) {  

  127.            return defaultValue;  

  128.        }  

  129.        try {  

  130.            return BigDecimal.valueOf(b1.doubleValue()).divide(BigDecimal.valueOf(b2.doubleValue()), 2, BigDecimal.ROUND_HALF_UP);  

  131.        } catch (Exception e) {  

  132.            return defaultValue;  

  133.        }  

  134.    }  

  135.   

  136.    /** 

  137.     * BigDecimal的乘法运算封装 

  138.     * @author : shijing 

  139.     * 2017年3月23日下午5:01:57 

  140.     * @param b1 

  141.     * @param b2 

  142.     * @return 

  143.     */  

  144.    public static <T extends Number> BigDecimal safeMultiply(T b1, T b2) {  

  145.        if (null == b1 ||  null == b2) {  

  146.            return BigDecimal.ZERO;  

  147.        }  

  148.        return BigDecimal.valueOf(b1.doubleValue()).multiply(BigDecimal.valueOf(b2.doubleValue())).setScale(2, BigDecimal.ROUND_HALF_UP);  

  149.    }  

  150.   

  151. }  


Optional所在的jar以及版本:guava-18.0.ar

 

pom.xml配置:

 

[html] view plain copy

  1. <!-- https://mvnrepository.com/artifact/com.google.guava/guava -->  

  2. <dependency>  

  3.     <groupId>com.google.guava</groupId>  

  4.     <artifactId>guava</artifactId>  

  5.     <version>18.0</version>  

  6. </dependency>  

***本网站图片,文字之类版权申明,因为网站可以由注册用户自行上传图片或文字,本网站无法鉴别所上传图片或文字的知识版权,如果侵犯,请及时通知我们,本网站将在第一时间及时删除。

我要评论

网友评论


评论时间:2023-04-04 00:25:01

2.虚拟专用服务器(也叫做通用服务器):虚拟主机能做域名解析 将移动云主机特点 .虚拟专用服务器(也叫做通用服务器):将一台或多台计算机整合成一套专用系统的服务


评论时间:2023-03-06 18:25:01

python是一门学习非常快、而且很简虚拟主机如何建站 单的编程语言,它在我们日常生活中无处不在,只要你有时间和兴趣就可以学会了云服务器app 只要你有时间和兴趣就可以学会了


评论时间:2023-02-25 21:25:02

本文主要针对MEC技云主机优缺点在哪里 术应用最好的云主机 要针对MEC技术应用于服务器的关键技术展开研究


评论时间:2023-02-09 18:25:01

随着国家政服务器机柜批发价格 策对“绿色发展”要求不断提高,以及云计算技术的普及应用,预计未来几年将成为服务器行百度云虚拟主机建网盘 为服务器行业新的增长点


评论时间:2023-01-20 00:25:02

24虚拟主机搭建ssr 虚拟主机价格差距大 24


评论时间:2022-08-13 15:25:02

七星云主机互联 6.如何购买虚拟主机做网站 安全性

最新文章

 2023-12-25 22:44:35   admin

活动发布区版规

 2023-05-27 22:03:52   御风而行

容器、无服务器、虚拟机:安全性差...

 2023-05-27 19:08:41   小绵羊0123

科技巨头布局云端 服务器 网络硬...

 2023-05-27 18:17:46   姐姐的跟屁虫

钉钉因系统访问流量激增,宕机1小...

热门阅读

 2022-07-23 00:34:02   freeatom

常见ftp命令 FTP命令使用详...

 2022-07-21 02:17:02   ares

双硬盘组建Raid0磁盘阵列图文...

 2022-07-20 06:17:02   mankeung123

用友软件客户端连接不上服务器的解...

 2022-07-23 00:51:02   antonfxb

WebService实例

 2022-07-13 05:38:02   苯小孩

开发、运维不可不看的Linux调...

 2022-07-20 18:51:02   nightstone

如何使用Charles抓取Web...

随机文章

 2022-04-08 05:38:03   xc777

Windows Server 2...

 2022-07-16 05:38:02   草儿

CIO时代院长姚乐:新一代信息技...

 2022-07-19 05:34:03   ghh

2018国内外10款erp软件排...

 2022-07-19 10:00:05   sakot

DNS服务器的配置与管理

 2022-07-20 00:17:02   zhouproxy

金蝶kis专业版教程-用户管理设...

 2022-07-20 04:17:02   wudi11628

有效权限与删除ACL权限(3)

热评文章

 2022-07-19 20:17:02   dengyu0429

linux vi使用及详细介绍

 2022-07-20 01:00:05   激动的舌头

Linux视频教程:用户管理命令...

 2022-07-21 20:51:02   jessica-an

创建本地FTP站点

 2022-02-07 05:38:03   jasonkidd

WEB服务器配置详解

 2022-07-20 04:51:02   wolfssss

ACL权限-默认与递归(4)

 2022-07-22 15:00:05   淡水珊瑚

Linux下 Samba Ser...
全球云服务器
Catfish(鲶鱼) Blog V 4.7.3