如何判断数字超出Integer类型的取值范围?
判断数字是否超出Integer取值范围的优化方案
首先,你的思路方向是对的——通过字符串长度快速过滤大部分超出范围的情况,但当前逻辑确实存在漏洞,而且可以进一步优化效率。
先明确核心需求:
- 当数字大于
Integer.MAX_VALUE(即2147483647)时,返回Integer.MAX_VALUE - 当数字小于
Integer.MIN_VALUE(即-2147483648)时,返回Integer.MIN_VALUE - 示例:输入
2000000000000时,返回Integer.MAX_VALUE
现有解法的问题
你当前的代码通过字符串长度判断:
if(str.length() >= 10) { if(str.charAt(0) != '-') { return Integer.MAX_VALUE; } else if(str.length() >= 11 && str.charAt(0) == '-') { return Integer.MIN_VALUE; } }
这个逻辑有两个明显的问题:
- 长度等于10的正数不一定超出范围:比如
2147483647是合法的Integer最大值,但长度也是10,你的代码会直接返回Integer.MAX_VALUE,这就出错了。 - 长度等于11的负数并非都超出范围:只有
-2147483649及更小的数才需要返回Integer.MIN_VALUE,但你的代码只要长度>=11就返回最小值,不准确。
优化后的高效实现
我们可以在长度判断的基础上,加上字符串内容的边界比较,既保留长度判断的高效性,又能精准处理临界值:
public static int clampToInteger(String str) { // 处理正数情况 if (!str.startsWith("-")) { if (str.length() > 10) { return Integer.MAX_VALUE; } else if (str.length() == 10) { // 和Integer最大值的字符串形式比较 if (str.compareTo(String.valueOf(Integer.MAX_VALUE)) > 0) { return Integer.MAX_VALUE; } } } else { // 处理负数情况 if (str.length() > 11) { return Integer.MIN_VALUE; } else if (str.length() == 11) { // 和Integer最小值的字符串形式比较 if (str.compareTo(String.valueOf(Integer.MIN_VALUE)) < 0) { return Integer.MIN_VALUE; } } } // 若在范围内,直接转换返回 return Integer.parseInt(str); }
为什么这个方案更高效?
- 大部分长度明显超出的情况(比如长度11的正数、长度12的负数)可以直接返回结果,不需要执行字符串转数字的开销
- 只有长度刚好处于临界值(10位正数、11位负数)时,才需要做一次轻量的字符串比较,性能损耗极低
- 避免了
Integer.parseInt()抛出NumberFormatException的情况,省去了异常处理的额外成本
测试用例验证
- 输入
2000000000000:长度>10,返回Integer.MAX_VALUE - 输入
2147483647:长度=10,比较后等于最大值,直接返回2147483647 - 输入
2147483648:长度=10,比较后大于最大值,返回Integer.MAX_VALUE - 输入
-2147483648:长度=11,比较后等于最小值,直接返回-2147483648 - 输入
-2147483649:长度=11,比较后小于最小值,返回Integer.MIN_VALUE
内容的提问来源于stack exchange,提问作者desperatecoder
相关产品推荐
相关产品推荐

