MathUtil
MathUtil是Hutool中用于处理复杂数学计算的工具类,提供了排列组合、阶乘、最大公约数、最小公倍数等功能。
# 主要功能
- 排列组合:排列数计算、组合数计算
- 阶乘计算:普通阶乘、范围阶乘
- 金额转换:元转分、分转元
- 最大公约数和最小公倍数:计算两个数的最大公约数和最小公倍数
- 其他数学计算:平方根算法等
# 排列组合
# arrangementCount(int n, int m)
计算排列数,即A(n, m) = n!/(n-m)!
long count = MathUtil.arrangementCount(5, 2);
// 输出: 20 (5*4)
# arrangementCount(int n)
计算排列数,即A(n, n) = n!
long count = MathUtil.arrangementCount(5);
// 输出: 120 (5!)
# combinationCount(int n, int m)
计算组合数,即C(n, m) = n!/((n-m)!*m!)
long count = MathUtil.combinationCount(5, 2);
// 输出: 10 (5*4/(2*1))
# arrangementSelect(String[] datas, int m)
排列选择,从列表中选择m个元素进行排列
String[] datas = {"A", "B", "C"};
List<String[]> result = MathUtil.arrangementSelect(datas, 2);
// 输出: [[A, B], [A, C], [B, A], [B, C], [C, A], [C, B]]
# arrangementSelect(String[] datas)
全排列选择,列表全部参与排列
String[] datas = {"A", "B", "C"};
List<String[]> result = MathUtil.arrangementSelect(datas);
// 输出: [[A, B, C], [A, C, B], [B, A, C], [B, C, A], [C, A, B], [C, B, A]]
# combinationSelect(String[] datas, int m)
组合选择,从列表中选择m个元素进行组合
String[] datas = {"A", "B", "C"};
List<String[]> result = MathUtil.combinationSelect(datas, 2);
// 输出: [[A, B], [A, C], [B, C]]
# 阶乘计算
# factorial(long n)
计算阶乘,n! = n * (n-1) * ... * 2 * 1
long result = MathUtil.factorial(5);
// 输出: 120 (5!)
long result2 = MathUtil.factorial(0);
// 输出: 1 (0! = 1)
注意:由于long类型的限制,n必须在0-20之间,否则会抛出异常。
# factorial(BigInteger n)
计算阶乘,支持大数阶乘
BigInteger result = MathUtil.factorial(BigInteger.valueOf(25));
// 输出: 15511210043330985984000000
# factorial(long start, long end)
计算范围阶乘,即start * (start-1) * ... * (end+1)
long result = MathUtil.factorial(5, 2);
// 输出: 60 (5*4*3)
# factorial(BigInteger start, BigInteger end)
计算范围阶乘,支持大数范围阶乘
BigInteger result = MathUtil.factorial(BigInteger.valueOf(10), BigInteger.valueOf(5));
// 输出: 151200 (10*9*8*7*6)
# 金额转换
# yuanToCent(double yuan)
将金额从元转换为分
long cent = MathUtil.yuanToCent(123.45);
// 输出: 12345
# centToYuan(long cent)
将金额从分转换为元
double yuan = MathUtil.centToYuan(12345);
// 输出: 123.45
# 最大公约数和最小公倍数
# gcd(int a, int b)
计算两个数的最大公约数
int gcd = MathUtil.gcd(12, 18);
// 输出: 6
int gcd2 = MathUtil.gcd(0, 5);
// 输出: 5
注意:两个数必须都是非负数
# multiple(int m, int n)
计算两个数的最小公倍数
int lcm = MathUtil.multiple(12, 18);
// 输出: 36
int lcm2 = MathUtil.multiple(5, 7);
// 输出: 35
# 其他数学计算
# sqrt(long x)
计算平方根
long sqrt = MathUtil.sqrt(16);
// 输出: 4
long sqrt2 = MathUtil.sqrt(25);
// 输出: 5
注意:此方法返回long类型,只适用于完全平方数。对于一般情况,推荐使用Math.sqrt(double)
# processMultiple(int selectNum, int minNum)
计算双色球、大乐透等彩票的注数
// 选7个红球,最少中5个的注数
int notes = MathUtil.processMultiple(7, 5);
// 输出: 21
# 注意事项
阶乘计算:
factorial(long n)方法只支持n在0-20之间,超过20会导致long类型溢出- 对于大数值阶乘,建议使用
factorial(BigInteger n)方法
排列组合:
- 排列组合的结果可能会很大,超出long类型的范围
- 对于大数值的排列组合,建议使用其他方法或库
最大公约数和最小公倍数:
- 两个数必须都是非负数
- 最小公倍数可能会导致int类型溢出,此时会抛出异常
金额转换:
- 元转分时,会自动处理小数位数,确保精度
- 分转元时,会将分转换为元,保留两位小数
# 总结
MathUtil提供了丰富的数学计算功能,涵盖了排列组合、阶乘计算、金额转换、最大公约数和最小公倍数等多个方面。通过使用MathUtil,可以简化复杂的数学计算,提高开发效率。
无论是在游戏开发、数据分析还是日常开发中,MathUtil都能提供简洁高效的数学计算解决方案。