当前位置: 首页 > 编程笔记 >

Java使用BigDecimal进行运算封装的实际案例

滕鸿畴
2023-03-14
本文向大家介绍Java使用BigDecimal进行运算封装的实际案例,包括了Java使用BigDecimal进行运算封装的实际案例的使用技巧和注意事项,需要的朋友参考一下

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

import java.math.BigDecimal;
public class NumberArithmeticUtils {
 /**
 * BigDecimal的加法运算封装
 * @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加法运算的封装
 * @param b1 第一个数
 * @param bn 需要加的加法数组
 * @注 : 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;
 }
 /**
 * 计算金额方法
 * @param b1
 * @param bn
 * @return
 */
 public static BigDecimal safeSubtract(BigDecimal b1, BigDecimal... bn) {
 return safeSubtract(true, b1, bn);
 }
 /**
 * BigDecimal的安全减法运算
 * @param isZero 减法结果为负数时是否返回0,true是返回0(金额计算时使用),false是返回负数结果
 * @param b1 被减数
 * @param bn 需要减的减数数组
 * @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;
 }
 /**
 * 整型的减法运算,小于0时返回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;
 }
 /**
 * 金额除法计算,返回2位小数(具体的返回多少位大家自己看着改吧)
 * @param b1
 * @param b2
 * @return
 */
 public static <T extends Number> BigDecimal safeDivide(T b1, T b2){
 return safeDivide(b1, b2, BigDecimal.ZERO);
 }
 /**
 * BigDecimal的除法运算封装,如果除数或者被除数为0,返回默认值
 * 默认返回小数位后2位,用于金额计算
 * @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的乘法运算封装
 * @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>

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对小牛知识库的支持。如果你想了解更多相关内容请查看下面相关链接

 类似资料:
  • 本文向大家介绍java 使用BigDecimal进行货币金额计算的操作,包括了java 使用BigDecimal进行货币金额计算的操作的使用技巧和注意事项,需要的朋友参考一下 float和double只能用来做科学计算或者是工程计算,在商业计算中我们要用 java.math.BigDecimal。 而且使用BigDecimal类也可以进行大数的操作。 方法 类型 描述 public BigDeci

  • 本文向大家介绍java封装实例用法讲解,包括了java封装实例用法讲解的使用技巧和注意事项,需要的朋友参考一下 我们可以选择把类的方法、属性装起来,便于日后的程序书写和使用,这种处理方法就是封装的思想。因为封装类之后,其他的外部类方法就不能在混入其中,对代码的安全性进行了提高。接下来我们就对java中封装的概念、目的进行介绍,然后在实例中为大家演示封装的方法。 1.概念 封装性是面向对象三大特征之

  • 问题内容: 一些有趣的发现wrt等于0和0.0上的运算符 返回false,而返回true。 返回false,而返回true。 看起来在两种情况下都完成了字符串比较。谁能对此有所启发。 谢谢。 问题答案: BigDecimal“等于”比较值和小数位数。如果只想比较值(0 == 0.0),则应使用compareTo: 参见javadoc。 至于Double比较,如其他答案所述,您正在将Double与I

  • 我已经创建了一个bean类,其中包含所有字段(name、amount、description和number),以及相同的getter和setter。productBeans有所有产品的列表。 groupByProduct具有用名称分组的产品列表。结果给出了以产品地图为关键,以产品总量为价值的产品地图。 但在这里,我试图将产品和总金额映射到产品列表中。我试图结合上面的代码来获得预期的输出,但未能实现

  • 本文向大家介绍使用python装饰器计算函数运行时间的实例,包括了使用python装饰器计算函数运行时间的实例的使用技巧和注意事项,需要的朋友参考一下 装饰器在python里面有很重要的作用, 如果能够熟练使用,将会大大的提高工作效率 今天就来见识一下 python 装饰器,到底是怎么工作的。 本文主要是利用python装饰器计算函数运行时间 一些需要精确的计算函数运行了多久的程序,都可以采用这种

  • 我创建了两个类来计算数字,其中一个类同步执行,另一个类将其分成两半,并在两个线程中执行这两半。(intel i5(4个CPU),8GB ram)代码如下: 公共类: 多线程执行:public class Sheet2{