数字工具类 - NumberUtil
# 数字工具类 - NumberUtil
简介
NumberUtil
是 Hutool 提供的一个针对数字运算的工具类,封装了常用的数学运算、数字格式化、随机数生成、数字校验等功能,简化了对数字的操作。它不仅解决了 float
和 double
类型无法进行精确计算的问题,还提供了许多便捷的方法来处理数字运算和格式化。
# 1. 加减乘除运算
NumberUtil
提供了 add
、sub
、mul
、div
方法,用于对数字进行加减乘除运算。这些方法会将 double
转为 BigDecimal
后进行计算,避免了 float
和 double
计算时的精度问题。
import cn.hutool.core.util.NumberUtil;
public class NumberUtilExample {
public static void main(String[] args) {
// 加法运算
double resultAdd = NumberUtil.add(1.2, 3.4);
System.out.println("加法结果: " + resultAdd); // 结果:4.6
// 减法运算
double resultSub = NumberUtil.sub(5.5, 2.2);
System.out.println("减法结果: " + resultSub); // 结果:3.3
// 乘法运算
double resultMul = NumberUtil.mul(2.5, 4.0);
System.out.println("乘法结果: " + resultMul); // 结果:10.0
// 除法运算
double resultDiv = NumberUtil.div(9.0, 3.0);
System.out.println("除法结果: " + resultDiv); // 结果:3.0
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
add(Number... values)
:加法运算,支持多个数字相加。sub(Number v1, Number v2)
:减法运算,支持两个数字相减。mul(Number... values)
:乘法运算,支持多个数字相乘。div(Number v1, Number v2)
:除法运算,支持两个数字相除。
作用: 这些方法解决了 float
和 double
类型的精度问题,适用于需要进行精确计算的场景,如财务计算、科学计算等。
实际开发场景: 在进行商业计算或任何对精度有要求的计算时,可以使用这些方法进行加减乘除运算。
# 2. 保留小数
NumberUtil
提供了两种方法来保留小数:round
和 roundStr
。
import cn.hutool.core.util.NumberUtil;
public class NumberUtilExample {
public static void main(String[] args) {
// 保留4位小数,使用四舍五入模式
double result1 = NumberUtil.round(123456.123456, 4).doubleValue();
System.out.println("四舍五入保留4位小数: " + result1); // 结果:123456.1235
// 保留2位小数,返回字符串形式
String result2 = NumberUtil.roundStr(123456.128456, 2);
System.out.println("四舍五入保留2位小数: " + result2); // 结果:123456.13
}
}
2
3
4
5
6
7
8
9
10
11
12
13
round(double value, int scale)
:使用四舍五入的方式保留指定位数的小数,返回BigDecimal
。roundStr(double value, int scale)
:使用四舍五入的方式保留指定位数的小数,返回字符串。
作用: 这些方法适用于需要保留指定小数位数的场景,确保结果的精度。
实际开发场景: 在对金额、科学数据等进行格式化时,使用这些方法可以确保结果的精度和一致性。
# 3. 数字格式化
NumberUtil
提供了 decimalFormat
方法,用于对数字进行格式化。它支持自定义格式,如添加千分位、保留小数位等。
import cn.hutool.core.util.NumberUtil;
public class NumberUtilExample {
public static void main(String[] args) {
long speedOfLight = 299792458; // 光速,单位:米/秒
// 将数字格式化为带有千分位的字符串
String formatted = NumberUtil.decimalFormat(",###", speedOfLight);
System.out.println("格式化后的光速: " + formatted); // 结果:299,792,458
}
}
2
3
4
5
6
7
8
9
10
11
decimalFormat(String pattern, Object value)
:使用指定的格式化模式对数字进行格式化,返回格式化后的字符串。
作用: 该方法适用于需要对数字进行格式化的场景,如报表输出、UI 展示等。
实际开发场景: 在生成报表或输出人类可读的数值时,可以使用此方法对数字进行格式化。
# 4. 校验数字
NumberUtil
提供了一组方法,用于校验数字的类型。
import cn.hutool.core.util.NumberUtil;
public class NumberUtilExample {
public static void main(String[] args) {
// 判断是否为数字
boolean isNumber = NumberUtil.isNumber("123.45");
System.out.println("是否为数字: " + isNumber); // 结果:true
// 判断是否为整数
boolean isInteger = NumberUtil.isInteger("123");
System.out.println("是否为整数: " + isInteger); // 结果:true
// 判断是否为浮点数
boolean isDouble = NumberUtil.isDouble("123.45");
System.out.println("是否为浮点数: " + isDouble); // 结果:true
// 判断是否为质数
boolean isPrime = NumberUtil.isPrimes(7);
System.out.println("是否为质数: " + isPrime); // 结果:true
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
isNumber(CharSequence str)
:判断字符串是否为数字。isInteger(CharSequence str)
:判断字符串是否为整数。isDouble(CharSequence str)
:判断字符串是否为浮点数。isPrimes(int number)
:判断数字是否为质数。
作用: 这些方法适用于需要校验用户输入或判断数字类型的场景。
实际开发场景: 在处理用户输入或需要验证数字格式时,可以使用这些方法进行校验,确保输入的有效性。
# 5. 随机数生成
NumberUtil
提供了生成不重复随机数的方法,可以生成指定范围内的不重复随机数列表。
import cn.hutool.core.util.NumberUtil;
import java.util.Arrays;
public class NumberUtilExample {
public static void main(String[] args) {
// 生成不重复的随机数列表,范围在[1, 100]之间,生成10个随机数
int[] randomNumbers = NumberUtil.generateRandomNumber(1, 100, 10);
System.out.println("生成的不重复随机数: " + Arrays.toString(randomNumbers));
}
}
2
3
4
5
6
7
8
9
10
11
generateRandomNumber(int min, int max, int size)
:生成指定范围内的不重复随机数列表。min
:随机数的最小值。max
:随机数的最大值。size
:生成随机数的个数。
作用: 该方法适用于需要生成随机数的场景,如抽奖、随机选取等。
实际开发场景: 在需要生成不重复随机数的场景下,如彩票号码生成、抽奖号码生成等,可以使用此方法。
# 6. 其它常用方法
NumberUtil
还提供了多种数学运算和转换方法,常见的包括阶乘、平方根、最大公约数、最小公倍数、二进制转换等。
import cn.hutool.core.util.NumberUtil;
public class NumberUtilExample {
public static void main(String[] args) {
// 计算阶乘
long factorial = NumberUtil.factorial(5);
System.out.println("5的阶乘: " + factorial); // 结果:120
// 计算平方根
double sqrt = NumberUtil.sqrt(16);
System.out.println("16的平方根: " + sqrt); // 结果:4.0
// 计算最大公约数
int gcd = NumberUtil.divisor(12, 18);
System.out.println("12和18的最大公约数: " + gcd); // 结果:6
// 计算最小公倍数
int lcm = NumberUtil.multiple(12, 18);
System.out.println("12和18的最小公倍数: " + lcm); // 结果:36
// 将数字转换为二进制字符串
String binaryStr = NumberUtil.getBinaryStr(10);
System.out.println("10的二进制表示: " + binaryStr); // 结果:1010
// 二进制字符串转换为int
int intValue = NumberUtil.binaryToInt("1010");
System.out.println("二进制1010转换为整数: " + intValue); // 结果:10
// 比较两个数值的大小
int comparison = NumberUtil.compare(10.5, 20.3);
System.out.println("比较10.5和20.3的大小: " + comparison); // 结果:-1 (表示10.5小于20.3)
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
factorial(int n)
:计算n
的阶乘,返回long
类型结果。sqrt(double value)
:计算给定值的平方根,返回double
类型结果。divisor(int a, int b)
:计算两个整数的最大公约数。multiple(int a, int b)
:计算两个整数的最小公倍数。getBinaryStr(int value)
:将整数转换为二进制字符串。binaryToInt(String binaryStr)
:将二进制字符串转换为int
类型。compare(Number a, Number b)
:比较两个数值的大小,返回-1
表示前者小于后者,0
表示两者相等,1
表示前者大于后者。
作用: 这些方法涵盖了多种数学计算和数值转换的需求,适用于需要处理复杂数学运算和数据格式转换的场景。
实际开发场景: 在需要进行数学计算或数据格式转换的场景下,如数据分析、科学计算、加密解密、二进制操作等,都可以使用这些方法。