1. 添加maven依赖
  2. <dependency>
  3. <groupId>com.google.guava</groupId>
  4. <artifactId>guava</artifactId>
  5. <version>18.0</version>
  6. </dependency>
  7. import java.math.BigDecimal;

  8. public class NumberArithmeticUtils {

  9. /**

  10. * BigDecimal的加法运算封装

  11. * @author : shijing

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

  13. * @param b1

  14. * @param bn

  15. * @return

  16. */

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

  18. if (null == b1) {

  19. b1 = BigDecimal.ZERO;

  20. }

  21. if (null != bn) {

  22. for (BigDecimal b : bn) {

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

  24. }

  25. }

  26. return b1;

  27. }

  28. /**

  29. * Integer加法运算的封装

  30. * @author : shijing

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

  32. * @param b1   第一个数

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

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

  35. * @return

  36. */

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

  38. if (null == b1) {

  39. b1 = 0;

  40. }

  41. Integer r = b1;

  42. if (null != bn) {

  43. for (Integer b : bn) {

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

  45. }

  46. }

  47. return r > 0 ? r : 0;

  48. }

  49. /**

  50. * 计算金额方法

  51. * @author : shijing

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

  53. * @param b1

  54. * @param bn

  55. * @return

  56. */

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

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

  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. * 整型的减法运算,小于0时返回0

  83. * @author : shijing

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

  85. * @param b1

  86. * @param bn

  87. * @return

  88. */

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

  90. if (null == b1) {

  91. b1 = 0;

  92. }

  93. Integer r = b1;

  94. if (null != bn) {

  95. for (Integer b : bn) {

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

  97. }

  98. }

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

  100. }

  101. /**

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

  103. * @author : shijing

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

  105. * @param b1

  106. * @param b2

  107. * @return

  108. */

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

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

  111. }

  112. /**

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

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

  115. * @author : shijing

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

  117. * @param b1

  118. * @param b2

  119. * @param defaultValue

  120. * @return

  121. */

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

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

  124. return defaultValue;

  125. }

  126. try {

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

  128. } catch (Exception e) {

  129. return defaultValue;

  130. }

  131. }

  132. /**

  133. * BigDecimal的乘法运算封装

  134. * @author : shijing

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

  136. * @param b1

  137. * @param b2

  138. * @return

  139. */

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

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

  142. return BigDecimal.ZERO;

  143. }

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

  145. }

  146. }

Java的BigDecimal,对运算封装的更多相关文章

  1. Java工具类之——BigDecimal运算封装(包含金额的计算方式)

    日常对于金额计算,应该都是用的BigDecimal,  可是苦于没有好的工具类方法,现在贡献一个我正在用的对于数字计算的工具类,项目中就是用的这个,简单粗暴好用,话不多说,代码奉上(该工具类需要引入g ...

  2. Java中的Bigdecimal类型运算

    Java中的Bigdecimal类型运算 双精度浮点型变量double可以处理16位有效数.在实际应用中,需要对更大或者更小的数进行运算和处理.Java在java.math包中提 供的API类BigD ...

  3. BigDecimal除法运算出现java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result的解决办法

    BigDecimal除法运算出现java.lang.ArithmeticException: Non-terminating decimal expansion; no exact represent ...

  4. Java中的数学运算BigDecimal

    Math类 package ch7; /** * Created by Jiqing on 2016/11/24. */ public class MathDemo { public static v ...

  5. Java使用BigDecimal保留double、float运算精度、保留指定位数有效数字、四舍五入

    工具类 package --; import java.math.BigDecimal; /** * Created by kongqw on 2015/12/10. */ public final ...

  6. 解决java.math.BigDecimal divide方法运算结果为无限小数问题

    http://samueli.iteye.com/blog/224755 BigDecimal除法运算报错,错误如下:Non-terminating decimal expansion; no exa ...

  7. Java使用BigDecimal解决浮点型运算丢失精度的问题

    @Test public void test1(){ System.out.print(0.05+0.01); } @Test public void test2(){ BigDecimal b1 = ...

  8. java中BigDecimal加减乘除基本用法

    Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算.双精度浮点型变量double可以处理16位有效数. 在实际应用中,需要对更大或者更小的数进 ...

  9. Java中BigDecimal的8种舍入模式

    java.math.BigDecimal 不可变的.任意精度的有符号十进制数.BigDecimal 由任意精度的整数非标度值和32位的整数标度(scale)组成. 如果为零或正数,则标度是小数点后的位 ...

随机推荐

  1. win10系统出现“VMware Workstation与Device/Credential Guard不兼容”的解决办法

    办公室win10 64位系统安装的VMware Workstation,有一天启动时出现提示"VMware Workstation 与 Device/Credential Guard 不兼容 ...

  2. python的多线程和java的多线程之间的区别

    在python中,由于Cpython解释器的全局解释器的存在,那么多线程的话在同一时刻只能有一个线程执行,意思就是python中的多线程只能并发执行, 没有办法实现真正的并行,也就是无法利用多核CPU ...

  3. Lucas(卢卡斯)定理模板&&例题解析([SHOI2015]超能粒子炮·改)

    Lucas定理 先上结论: 当p为素数: \(\binom{ N }{M} \equiv \binom{ N/p }{M/p}*\binom{ N mod p }{M mod p} (mod p)\) ...

  4. NB-IoT DTU是什么 NB-IoT的优势有哪些

    NB-IoT DTU是什么 NB-IoT DTU是一种采用NB-IoT技术实现数据远距离无线传输功能的终端设备,采用工业级的硬件设施和工业级的32位高性能通信处理器,工业级的无线数据传输模块,可以自动 ...

  5. Go语言的互斥锁Mutex

    目录 一.使用方法 二.死锁场景 1.Lock/Unlock不是成对出现 2.锁被拷贝使用 3.循环等待 一.使用方法 Mutext是互斥锁的意思,也叫排他锁,同一时刻一段代码只能被一个线程运行,两个 ...

  6. ASP.NET Core Authentication系列(三)Cookie选项

    前言 在本系列第一篇文章介绍了ASP.NET时代如何认证,并且介绍了如何通过web.config文件来配置Auth Cookie的选项. 第二篇文章介绍了如何使用Cookie认证,本文介绍几个常见的C ...

  7. cenos7 u disk install

    分类:             其他              2014-08-24 13:53     3406人阅读     评论(0)     收藏     举报 CentOS安装教程操作系统 ...

  8. POJ 2432

    \(\mathbf{POJ\;2432}\)题解 题意 给出圆上的\(N\)个点,每个点有一个经度(大于\(0\)小于\(360\)):再给出\(M\)条双向边,保证边\(x y\)仅会沿圆上较短的弧 ...

  9. OpenCV计算机视觉学习(10)——图像变换(傅里叶变换,高通滤波,低通滤波)

    如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 在数 ...

  10. c# 表达式树(一)

    前言 打算整理c# 代码简化史系列,所以相关的整理一下,简单的引出一下概念. 什么是表达式树呢? 表达式树以树形数据结构表示代码,其中每一个节点都是一种表达式,比如方法调用和 x < y 这样的 ...