Hutool NumUtil 教程

NumUtil 是 Hutool 工具包中的数字工具类,提供了丰富的数字处理、校验、转换等方法。

Maven 依赖

XML 复制代码
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.25</version>
</dependency>

常用方法详解

1. 类型判断

java 复制代码
import cn.hutool.core.util.NumberUtil;

// 判断是否为整数(包括Integer、Long、Byte、Short)
NumberUtil.isInteger(3.5);   // false
NumberUtil.isInteger(3);     // true

// 判断是否为浮点数
NumberUtil.isDouble(3.5);    // true
NumberUtil.isDouble(3);      // false

// 判断是否为数字(正则匹配)
NumberUtil.isNumber("123");    // true
NumberUtil.isNumber("12.3");   // true
NumberUtil.isNumber("12a");    // false

// 判断是否为空(null或NaN)
NumberUtil.isNull(null);       // true
NumberUtil.isNull(Double.NaN); // true

2. 四则运算

java 复制代码
// 加法(精确计算)
NumberUtil.add(0.1, 0.2);          // 0.3(避免 0.30000000000000004)
NumberUtil.add("0.1", "0.2");      // 0.3

// 减法
NumberUtil.sub(0.3, 0.1);          // 0.2

// 乘法
NumberUtil.mul(0.1, 0.2);          // 0.02

// 除法(需要指定精度)
NumberUtil.div(10, 3, 2);          // 3.33(保留2位小数)
NumberUtil.div(10, 3, 2, RoundingMode.HALF_UP); // 3.33

// 求余
NumberUtil.mod(10, 3);             // 1

3. 数字格式化

java 复制代码
// 保留小数位数
NumberUtil.round(3.14159, 2);      // 3.14
NumberUtil.roundStr(3.14159, 2);   // "3.14"

// 百分比
NumberUtil.toPercent(0.25);        // "25%"
NumberUtil.toPercent(0.256, 1);    // "25.6%"(保留1位小数)

// 千分位格式化
NumberUtil.decimalFormat("###,###", 1234567);     // "1,234,567"
NumberUtil.decimalFormat("#.##", 123.456);        // "123.46"

// 科学计数法转普通数字
NumberUtil.toStr(1.23E10);         // "12300000000"

4. 比较运算

java 复制代码
// 比较大小(支持多种类型)
NumberUtil.compare(5, 3);          // 1 (5 > 3)
NumberUtil.compare(3, 5);          // -1 (3 < 5)
NumberUtil.compare(5, 5);          // 0 (相等)

// 是否在区间内
NumberUtil.isIn(5, 1, 10);         // true(包含边界)
NumberUtil.isIn(0, 1, 10);         // false

// 范围内检查
NumberUtil.range(5, 1, 10);        // 5(正常返回)
NumberUtil.range(0, 1, 10);        // 1(超出下限返回下限)
NumberUtil.range(20, 1, 10);       // 10(超出上限返回上限)

// 等于(忽略精度)
NumberUtil.equals(0.1 + 0.2, 0.3); // true
NumberUtil.equals(3.14, 3.14);     // true

5. 进制转换

java 复制代码
// 十进制转其他进制
NumberUtil.toBinaryString(10);     // "1010"
NumberUtil.toOctalString(10);      // "12"
NumberUtil.toHexString(10);        // "a"

// 其他进制转十进制
NumberUtil.binaryToInt("1010");    // 10
NumberUtil.octalToInt("12");       // 10
NumberUtil.hexToInt("a");          // 10

6. 随机数生成

java 复制代码
// 生成随机整数 [min, max]
NumberUtil.generateRandomNumber(1, 100, 5);  // 生成5个不重复的随机数

// 生成随机整数列表
NumberUtil.generateBySet(1, 100, 10);        // Set<Integer>

// 简单随机数(Hutool 5.x 后建议使用 RandomUtil)
NumberUtil.randomInt(1, 100);      // 随机整数
NumberUtil.randomDouble(1, 100);   // 随机浮点数

7. 数字校验与解析

java 复制代码
// 验证是否为有效数字
NumberUtil.isValidNumber(123);      // true
NumberUtil.isValidNumber(Double.NaN); // false

// 解析数字(安全,不抛异常)
NumberUtil.parseNumber("123");      // 123
NumberUtil.parseNumber("abc");      // null

// 解析整数
NumberUtil.parseInt("123");         // 123
NumberUtil.parseInt("abc", 0);      // 0(默认值)

// 解析浮点数
NumberUtil.parseDouble("3.14");     // 3.14
NumberUtil.parseDouble("abc", 0.0); // 0.0

8. 其他实用方法

java 复制代码
// 计算阶乘
NumberUtil.factorial(5);            // 120

// 最大公约数
NumberUtil.gcd(12, 18);             // 6

// 最小公倍数
NumberUtil.lcm(4, 6);               // 12

// 判断奇偶数
NumberUtil.isOdd(5);                // true(奇数)
NumberUtil.isEven(4);               // true(偶数)

// 获取数字的位数
NumberUtil.digitLength(12345);      // 5
NumberUtil.digitLength(3.14);       // 2(整数部分位数)

// 保留N位有效数字
NumberUtil.roundStr(12.345, 3);     // "12.3"

完整示例

java 复制代码
import cn.hutool.core.util.NumberUtil;
import java.math.RoundingMode;

public class NumUtilDemo {
    public static void main(String[] args) {
        // 1. 精确计算
        double result = NumberUtil.add(0.1, 0.2);
        System.out.println("0.1 + 0.2 = " + result);  // 0.3
        
        // 2. 格式化
        String price = NumberUtil.roundStr(19.99 * 0.8, 2);
        System.out.println("折扣价:" + price);  // 15.99
        
        // 3. 百分比
        double passRate = 85.5 / 100;
        System.out.println("通过率:" + NumberUtil.toPercent(passRate, 1));  // 85.5%
        
        // 4. 区间限制
        int score = NumberUtil.range(105, 0, 100);
        System.out.println("限制后的分数:" + score);  // 100
        
        // 5. 数字校验
        boolean isValid = NumberUtil.isNumber("3.14159");
        System.out.println("是否为数字:" + isValid);  // true
    }
}

注意事项

  1. 浮点数计算 :使用 add()sub()mul()div() 避免精度丢失

  2. 除法精度:除法时必须指定小数位数,否则可能抛出异常

  3. 空值处理:大多数方法对 null 输入返回 null 或默认值,不会抛出 NPE

  4. 版本差异 :部分方法在 Hutool 5.x 后移到 RandomUtil,建议查阅官方文档

相关推荐
Greyson12 小时前
不同品牌SSD对HTML函数工具加载速度影响大吗_存储测试汇总【汇总】
jvm·数据库·python
AI人工智能+电脑小能手2 小时前
【大白话说Java面试题】【Java基础篇】第3题:ArrayList和LinkedList有什么区别
java·开发语言·后端·面试·list
2301_764150562 小时前
网页如何运行html
jvm·数据库·python
baidu_340998822 小时前
C#怎么实现图片缩略图生成 C#如何批量生成图片的缩略图指定尺寸保持比例不变形【图像】
jvm·数据库·python
qq_372906932 小时前
CSS如何引入CSS预加载器配置_优化样式编译流程提升效率
jvm·数据库·python
2401_897190552 小时前
CSS如何使用currentColor关键字_让颜色自动继承父级属性
jvm·数据库·python
m0_684501982 小时前
如何在 Discord.py 中限制按钮仅由特定角色用户点击
jvm·数据库·python
AI人工智能+电脑小能手2 小时前
【大白话说Java面试题】【Java基础篇】第4题:LinkedList是单向链表还是双向链表
java·开发语言·数据结构·后端·链表·面试·list
qq_342295822 小时前
HTML怎么创建评论区域_HTML嵌套评论语义结构【详解】
jvm·数据库·python