game-api/ff-base/src/main/java/com/ff/base/utils/NumberUtils.java

61 lines
1.9 KiB
Java
Raw Normal View History

2025-02-11 15:27:15 +08:00
package com.ff.base.utils;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Optional;
import java.util.concurrent.ThreadLocalRandom;
public class NumberUtils {
/**
*
*
* @param totalCount
* @param remainingCount
* @param scale
* @return {@link BigDecimal }
*/
public static BigDecimal calculateProportion(Number totalCount, Number remainingCount, int scale) {
BigDecimal total = Optional.ofNullable(totalCount)
.map(val -> new BigDecimal(val.toString()))
.orElse(BigDecimal.ZERO);
BigDecimal remaining = Optional.ofNullable(remainingCount)
.map(val -> new BigDecimal(val.toString()))
.orElse(BigDecimal.ZERO);
if (total.compareTo(BigDecimal.ZERO) != 0) {
return remaining.divide(total, scale, RoundingMode.HALF_UP).multiply(new BigDecimal("100")).setScale(2, RoundingMode.DOWN);
} else {
return BigDecimal.ZERO;
}
}
/**
* BigDecimal
*
* @param min
* @param max
* @return BigDecimal
*/
public static BigDecimal getRandomBigDecimal(BigDecimal min, BigDecimal max) {
// 确保 min 小于 max
if (min.compareTo(max) > 0) {
throw new IllegalArgumentException("最小值应小于最大值");
}
// 计算范围的差值
BigDecimal range = max.subtract(min);
// 使用 ThreadLocalRandom 生成 [0, 1) 之间的随机数
double randomDouble = ThreadLocalRandom.current().nextDouble();
// 计算随机值
BigDecimal randomValue = min.add(range.multiply(BigDecimal.valueOf(randomDouble)));
// 设置保留两位小数
return randomValue.setScale(2, RoundingMode.HALF_UP);
}
}