package com.haogrgr.test.util;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.RoundingMode;
import java.util.Objects;
/**
* BigDecimal工具类
*
* @author desheng.tu
* @since 2015年6月12日 下午2:17:23
*
*/
public final class ArithUtils {
/** 默认除法的保留小数位, 测试发现值为19时的时间比18时多一倍多 **/
private static final int DIV_SCALE = 16;
/** 默认除法的截取模式为四舍五入 **/
private static final RoundingMode DIV_ROUNDING_MODE = RoundingMode.HALF_UP;
/**
* return a + b + c
*/
public static BigDecimal add(BigDecimal a, BigDecimal b, BigDecimal... c) {
Objects.requireNonNull(a);
Objects.requireNonNull(b);
BigDecimal sum = a.add(b);
if (c != null && c.length > 0) {
for (int i = 0; i < c.length; i++) {
Objects.requireNonNull(c[i]);
sum = sum.add(c[i]);
}
}
return sum;
}
/**
* return a + b + c
*/
public static BigDecimal add(BigDecimal a, long b, long... c) {
Objects.requireNonNull(a);
BigDecimal sum = a.add(BigDecimal.valueOf(b));
if (c != null && c.length > 0) {
for (int i = 0; i < c.length; i++) {
sum = sum.add(BigDecimal.valueOf(c[i]));
}
}
return sum;
}
/**
* return a + b + c
*/
public static BigDecimal add(BigDecimal a, double b, double... c) {
Objects.requireNonNull(a);
BigDecimal sum = a.add(BigDecimal.valueOf(b));
if (c != null && c.length > 0) {
for (int i = 0; i < c.length; i++) {
sum = sum.add(BigDecimal.valueOf(c[i]));
}
}
return sum;
}
/**
* return a + b + c
*/
public static BigDecimal add(double a, double b, double... c) {
BigDecimal sum = BigDecimal.valueOf(a).add(BigDecimal.valueOf(b));
if (c != null && c.length > 0) {
for (int i = 0; i < c.length; i++) {
sum = sum.add(BigDecimal.valueOf(c[i]));
}
}
return sum;
}
/**
* return a + b + c, 如果元素为空, 则使用0代替
*/
public static BigDecimal addna(BigDecimal a, BigDecimal b, BigDecimal... c) {
a = a == null ? BigDecimal.ZERO : a;
b = b == null ? BigDecimal.ZERO : b;
BigDecimal sum = a.add(b);
if (c != null && c.length > 0) {
for (int i = 0; i < c.length; i++) {
if (c[i] != null)
sum = sum.add(c[i]);
}
}
return sum;
}
/**
* return a -b -c
*/
public static BigDecimal sub(BigDecimal a, BigDecimal b, BigDecimal... c) {
Objects.requireNonNull(a);
Objects.requireNonNull(b);
BigDecimal sub = a.subtract(b);
if (c != null && c.length > 0) {
for (int i = 0; i < c.length; i++) {
Objects.requireNonNull(c[i]);
sub = sub.subtract(c[i]);
}
}
return sub;
}
/**
* return a -b -c
*/
public static BigDecimal sub(BigDecimal a, long b, long... c) {
Objects.requireNonNull(a);
BigDecimal sub = a.subtract(BigDecimal.valueOf(b));
if (c != null && c.length > 0) {
for (int i = 0; i < c.length; i++) {
sub = sub.subtract(BigDecimal.valueOf(c[i]));
}
}
return sub;
}
/**
* return a -b -c
*/
public static BigDecimal sub(BigDecimal a, double b, double... c) {
Objects.requireNonNull(a);
BigDecimal sub = a.subtract(BigDecimal.valueOf(b));
if (c != null && c.length > 0) {
for (int i = 0; i < c.length; i++) {
sub = sub.subtract(BigDecimal.valueOf(c[i]));
}
}
return sub;
}
/**
* return a -b -c, 如果元素为空, 则使用0代替
*/
public static BigDecimal subna(BigDecimal a, BigDecimal b, BigDecimal... c) {
a = a == null ? BigDecimal.ZERO : a;
b = b == null ? BigDecimal.ZERO : b;
BigDecimal sub = a.subtract(b);
if (c != null && c.length > 0) {
for (int i = 0; i < c.length; i++) {
if (c[i] != null)
sub = sub.subtract(c[i]);
}
}
return sub;
}
/**
* return a * b * c
*/
public static BigDecimal mul(BigDecimal a, BigDecimal b, BigDecimal... c) {
Objects.requireNonNull(a);
Objects.requireNonNull(b);
BigDecimal mul = a.multiply(b);
if (c != null && c.length > 0) {
for (int i = 0; i < c.length; i++) {
Objects.requireNonNull(c[i]);
mul = mul.multiply(c[i]);
}
}
return mul;
}
/**
* return a * b * c
*/
public static BigDecimal mul(BigDecimal a, long b, long... c) {
Objects.requireNonNull(a);
BigDecimal mul = a.multiply(BigDecimal.valueOf(b));
if (c != null && c.length > 0) {
for (int i = 0; i < c.length; i++) {
mul = mul.multiply(BigDecimal.valueOf(c[i]));
}
}
return mul;
}
/**
* return a * b * c
*/
public static BigDecimal mul(BigDecimal a, double b, double... c) {
Objects.requireNonNull(a);
BigDecimal mul = a.multiply(BigDecimal.valueOf(b));
if (c != null && c.length > 0) {
for (int i = 0; i < c.length; i++) {
mul = mul.multiply(BigDecimal.valueOf(c[i]));
}
}
return mul;
}
/**
* return (a / b) / c, 返回值保留DIV_SCALE位小数
*/
public static BigDecimal div(BigDecimal a, BigDecimal b, BigDecimal... c) {
Objects.requireNonNull(a);
Objects.requireNonNull(b);
BigDecimal divide = a.divide(b, DIV_SCALE, DIV_ROUNDING_MODE);
if (c != null && c.length > 0) {
for (int i = 0; i < c.length; i++) {
Objects.requireNonNull(c[i]);
divide = divide.divide(c[i], DIV_SCALE, DIV_ROUNDING_MODE);
}
}
return divide;
}
/**
* return (a / b) / c, 返回值保留DIV_SCALE位小数
*/
public static BigDecimal div(BigDecimal a, long b, long... c) {
Objects.requireNonNull(a);
BigDecimal divide = a.divide(BigDecimal.valueOf(b), DIV_SCALE, DIV_ROUNDING_MODE);
if (c != null && c.length > 0) {
for (int i = 0; i < c.length; i++) {
divide = divide.divide(BigDecimal.valueOf(c[i]), DIV_SCALE, DIV_ROUNDING_MODE);
}
}
return divide;
}
/**
* return (a / b) / c, 返回值保留DIV_SCALE位小数
*/
public static BigDecimal div(BigDecimal a, double b, double... c) {
Objects.requireNonNull(a);
BigDecimal divide = a.divide(BigDecimal.valueOf(b), DIV_SCALE, DIV_ROUNDING_MODE);
if (c != null && c.length > 0) {
for (int i = 0; i < c.length; i++) {
divide = divide.divide(BigDecimal.valueOf(c[i]), DIV_SCALE, DIV_ROUNDING_MODE);
}
}
return divide;
}
/**
* return a > b
*/
public static boolean gt(BigDecimal a, BigDecimal b) {
Objects.requireNonNull(a);
Objects.requireNonNull(b);
return a.compareTo(b) == 1;
}
/**
* return a > b
*/
public static boolean gt(BigDecimal a, long b) {
Objects.requireNonNull(a);
return a.compareTo(BigDecimal.valueOf(b)) == 1;
}
/**
* return a > b
*/
public static boolean gt(BigDecimal a, double b) {
Objects.requireNonNull(a);
return a.compareTo(BigDecimal.valueOf(b)) == 1;
}
/**
* return a >= b
*/
public static boolean gtOrEq(BigDecimal a, BigDecimal b) {
Objects.requireNonNull(a);
Objects.requireNonNull(b);
return a.compareTo(b) > -1;
}
/**
* return a >= b
*/
public static boolean gtOrEq(BigDecimal a, long b) {
Objects.requireNonNull(a);
return a.compareTo(BigDecimal.valueOf(b)) > -1;
}
/**
* return a >= b
*/
public static boolean gtOrEq(BigDecimal a, double b) {
Objects.requireNonNull(a);
return a.compareTo(BigDecimal.valueOf(b)) > -1;
}
/**
* return a < b
*/
public static boolean lt(BigDecimal a, BigDecimal b) {
Objects.requireNonNull(a);
Objects.requireNonNull(b);
return a.compareTo(b) == -1;
}
/**
* return a < b
*/
public static boolean lt(BigDecimal a, long b) {
Objects.requireNonNull(a);
return a.compareTo(BigDecimal.valueOf(b)) == -1;
}
/**
* return a < b
*/
public static boolean lt(BigDecimal a, double b) {
Objects.requireNonNull(a);
return a.compareTo(BigDecimal.valueOf(b)) == -1;
}
/**
* return a <= b
*/
public static boolean ltOrEq(BigDecimal a, BigDecimal b) {
Objects.requireNonNull(a);
Objects.requireNonNull(b);
return a.compareTo(b) < 1;
}
/**
* return a <= b
*/
public static boolean ltOrEq(BigDecimal a, long b) {
Objects.requireNonNull(a);
return a.compareTo(BigDecimal.valueOf(b)) < 1;
}
/**
* return a <= b
*/
public static boolean ltOrEq(BigDecimal a, double b) {
Objects.requireNonNull(a);
return a.compareTo(BigDecimal.valueOf(b)) < 1;
}
/**
* return a == b
*/
public static boolean eq(BigDecimal a, BigDecimal b, BigDecimal... c) {
Objects.requireNonNull(a);
Objects.requireNonNull(b);
if (a.compareTo(b) != 0) {
return false;
}
if (c != null && c.length > 0) {
for (int i = 0; i < c.length; i++) {
Objects.requireNonNull(c[i]);
if (a.compareTo(c[i]) != 0)
return false;
}
}
return true;
}
/**
* return a == b
*/
public static boolean eq(BigDecimal a, long b) {
Objects.requireNonNull(a);
return a.compareTo(BigDecimal.valueOf(b)) == 0;
}
/**
* return a == b
*/
public static boolean eq(BigDecimal a, double b) {
Objects.requireNonNull(a);
return a.compareTo(BigDecimal.valueOf(b)) == 0;
}
/**
* 四舍五入方法保留2位小数位,
*/
public static BigDecimal halfUp(BigDecimal n) {
return n.setScale(2, RoundingMode.HALF_UP);
}
/**
* 四舍五入方法保留2位小数位,
*/
public static BigDecimal halfUp(double n) {
return BigDecimal.valueOf(n).setScale(2, RoundingMode.HALF_UP);
}
/**
* 四舍五入方法保留指定小数位
*/
public static BigDecimal halfUp(BigDecimal n, int scale) {
return n.setScale(scale, RoundingMode.HALF_UP);
}
/**
* 四舍五入方法保留指定小数位
*/
public static BigDecimal halfUp(double n, int scale) {
return BigDecimal.valueOf(n).setScale(scale, RoundingMode.HALF_UP);
}
/**
* 保留指定小数位,其他的直接舍去
*/
public static BigDecimal down(BigDecimal n, int scale) {
return n.setScale(scale, RoundingMode.DOWN);
}
/**
* 保留指定小数位,其他的直接舍去
*/
public static BigDecimal down(double n, int scale) {
return BigDecimal.valueOf(n).setScale(scale, RoundingMode.DOWN);
}
/**
* 四舍五入方法保留2位小数位,
*/
public static String halfUpStr(BigDecimal n) {
return n.setScale(2, RoundingMode.HALF_UP).toString();
}
/**
* 四舍五入方法保留2位小数位,
*/
public static String halfUpStr(double n) {
return BigDecimal.valueOf(n).setScale(2, RoundingMode.HALF_UP).toString();
}
/**
* 四舍五入方法保留指定小数位
*/
public static String halfUpStr(BigDecimal n, int scale) {
return n.setScale(scale, RoundingMode.HALF_UP).toString();
}
/**
* 四舍五入方法保留指定小数位
*/
public static String halfUpStr(double n, int scale) {
return BigDecimal.valueOf(n).setScale(scale, RoundingMode.HALF_UP).toString();
}
/**
* 取最大值
*/
public static BigDecimal max(BigDecimal... eles) {
if (eles == null || eles.length == 0) {
return null;
}
BigDecimal max = eles[0];
for (BigDecimal ele : eles) {
Objects.requireNonNull(ele);
if (gt(ele, max))
max = ele;
}
return max;
}
/**
* 取最大值
*/
public static int max(int a, int b, int c) {
return Math.max(Math.max(a, b), c);
}
/**
* 取最小值
*/
public static BigDecimal min(BigDecimal... eles) {
if (eles == null || eles.length == 0) {
return null;
}
BigDecimal min = eles[0];
for (BigDecimal ele : eles) {
Objects.requireNonNull(ele);
if (lt(ele, min))
min = ele;
}
return min;
}
/**
* 将BigInteger, Float, Double, Long, Integer, Short, Byte, String转换为BigDecimal
*/
public static BigDecimal of(Object number) {
Objects.requireNonNull(number);
Class<?> clazz = number.getClass();
if (clazz == Double.class) {
return BigDecimal.valueOf((Double) number);
}
if (clazz == BigDecimal.class) {
return (BigDecimal) number;
}
if(clazz == String.class){
return new BigDecimal((String)number);
}
if (clazz == Integer.class) {
return BigDecimal.valueOf((Integer) number);
}
if (clazz == Float.class) {
return BigDecimal.valueOf((Float) number);
}
if (clazz == Long.class) {
return BigDecimal.valueOf((Long) number);
}
if (clazz == BigInteger.class) {
return new BigDecimal((BigInteger) number);
}
if (clazz == Short.class) {
return BigDecimal.valueOf((Short) number);
}
if (clazz == Byte.class) {
return BigDecimal.valueOf((Byte) number);
}
throw new IllegalArgumentException("不支持的转换类型 : " + number.getClass());
}
}