java计算百分比值的方法,涉及java数值运算的技巧
分子作被除数,分母作除数(分母不为0),运算结果和整数一起对应全部有理数
BigDecimalUtil工具类
import java.math.BigDecimal;
public class BigDecimalUtil {
private BigDecimalUtil() {
}
private static final int ZERO = 0;
/**
* @param value1 金额
* @return boolean
* @dis 判断金额是否小于0
*/
public static Boolean isSmallZero(BigDecimal value1) {
return getNotNullValue(value1).compareTo(new BigDecimal(ZERO)) < ZERO;
}
/**
* @param value1 金额
* @return boolean
* @dis 判断金额是否大于0
*/
public static Boolean isBigZero(BigDecimal value1) {
return getNotNullValue(value1).compareTo(new BigDecimal(ZERO)) > ZERO;
}
/**
* 保证金额不为空
*/
public static BigDecimal getNotNullValue(BigDecimal value) {
return null == value ? new BigDecimal(ZERO) : value;
}
/**
* 提供精确的加法运算。
*
* @param v1 被加数
* @param v2 加数
* @return 二个参数的和
*/
public static BigDecimal add(BigDecimal v1, BigDecimal v2) {
return getNotNullValue(v1).add(getNotNullValue(v2));
}
/**
* 提供精确的加法运算。
*
* @param v1 被加数
* @param v2 加数
* @param v3 加数
* @return 三个参数的和
*/
public static BigDecimal add(BigDecimal v1, BigDecimal v2, BigDecimal v3) {
return getNotNullValue(v1).add(getNotNullValue(v2).add(getNotNullValue(v3)));
}
/**
* 提供精确减法运算的sub方法(例:1-2,1是被减数,2是减数)
*
* @param value1 被减数
* @param value2 减数
* @return 两个参数的差
*/
public static BigDecimal subtract(BigDecimal value1, BigDecimal value2) {
return getNotNullValue(value1).subtract(getNotNullValue(value2));
}
/**
* 提供精确乘法运算的mul方法(例:1*2,1是被乘数,2是乘数)
*
* @param value1 被乘数
* @param value2 乘数
* @return 两个参数的积
*/
public static BigDecimal multiply(BigDecimal value1, BigDecimal value2) {
return getNotNullValue(value1).multiply(getNotNullValue(value2));
}
/**
* 提供精确的除法运算方法div(例:1÷2,1是被除数,2是除数)
*
* @param value1 被除数
* @param value2 除数
* @param scale 精确范围
* @return 两个参数的商
* @throws IllegalAccessException
*/
public static BigDecimal divide(BigDecimal value1, BigDecimal value2, int scale) {
return value1.divide(value2, scale, BigDecimal.ROUND_HALF_UP);
}
}
百分比计算工具类
import java.math.BigDecimal;
/**
* @author liuminglin
* @Date 2021/10/13 18:43
* @Desc 百分比计算工具类
*/
public class PercentageUtil {
/**
* 百分比
*/
public static final int PERCENTAGE = 100;
private PercentageUtil() {
}
/**
* 计算分母
* 分母计算规则:求和 value1+value2
* value1 计算百分比的字段
* value2 计算百分比的字段
*/
public static BigDecimal getDenominator(long value1, long value2) {
return BigDecimalUtil.add(new BigDecimal(value1), new BigDecimal(value2));
}
/**
* 计算分母
* 分母计算规则:求和 value1+value2
* value1 计算百分比的字段
* value2 计算百分比的字段
*/
public static BigDecimal getDenominator(String value1, String value2) {
return BigDecimalUtil.add(new BigDecimal(value1), new BigDecimal(value2));
}
/**
* 计算分母
*/
public static BigDecimal getDenominator(long value1, long value2, long value3) {
return BigDecimalUtil.add(new BigDecimal(value1), new BigDecimal(value2), new BigDecimal(value3));
}
/**
* 计算分母
*/
public static BigDecimal getDenominator(String value1, String value2, String value3) {
return BigDecimalUtil.add(new BigDecimal(value1), new BigDecimal(value2), new BigDecimal(value3));
}
/**
* 计算分母
* 分母计算规则:求和:args值相加
* ...args {多个可变参数:计算百分比的字段}
*/
public static BigDecimal getDenominator1(String... args) {
BigDecimal denominator = BigDecimal.ZERO;
for (String arg : args) {
denominator = denominator.add(new BigDecimal(arg));
}
return denominator;
}
/**
* @author
* @Date 2021/10/13 11:45
* @Desc 获取计算百分比
* @Param molecular :分子
* @Param denominator 分母
* @Return 返回百分比
* 分子:计算百分比的字段
* 分母计算规则:求和
* 百分比计算规则:拿分子乘以100/分母
*/
public static BigDecimal getComputePercent(long numerator, long denominator, int scale) {
BigDecimal result = new BigDecimal(numerator).multiply(new BigDecimal(100))
.divide(new BigDecimal(denominator), scale, BigDecimal.ROUND_HALF_UP);
return result;
}
/**
* @author
* @Date 2021/10/13 11:45
* @Desc 获取计算百分比
* @Param molecular :分子
* @Param denominator 分母
* @Param scale .数点精确到几位
* @Return 返回百分比
* 分子:计算百分比的字段
* 分母计算规则:求和
* 百分比计算规则:拿分子乘以100/分母
*/
public static BigDecimal getComputePercent(String numerator, String denominator, int scale) throws IllegalAccessException {
BigDecimal result = BigDecimalUtil.multiply(new BigDecimal(numerator), new BigDecimal(PERCENTAGE));
return BigDecimalUtil.divide(result, new BigDecimal(denominator), scale);
}
public static void main(String[] args) throws IllegalAccessException {
//分母1
BigDecimal sum = getDenominator("298", "34123", "65789");
//百分比1
BigDecimal percentt1 = getComputePercent("298", sum.toString(), 2);
BigDecimal percentt2 = getComputePercent("34123", sum.toString(), 2);
BigDecimal percentt3 = getComputePercent("65789", sum.toString(), 2);
System.out.println(percentt1 + "%");
System.out.println(percentt2 + "%");
System.out.println(percentt3 + "%");
BigDecimal test = getDenominator1("298", "34123", "65789");
System.out.println(" 分母1 " + sum);
System.out.println(" 分母2 " + test);
}
}
测试结果如下