java - Java 解析字符串以进行双重溢出检查
问题描述
我正在写一个计算器演示。计算器接受用户输入(字符串)并进行一些计算。第一步是将字符串解析为双精度。
我正在使用 NumberUtils.isParsable()
和Double.parseDouble()
。但是,我想限制用户输入,以便双数不会溢出。似乎parseDouble()
只检查字符串是否为数字。我没有找到任何检查字符串值的方法。
我想知道这样做的最佳方法是什么。
解决方案
您可以使用BigDecimal
该类根据 a 的最大值检查输入double
。
这是一个方法,true
如果提供String
的数值小于或等于 a 的最大值double
,则返回false
,当输入大于 adouble
可以表示的最大值时返回。
public static boolean isValidDouble(String input){
final BigDecimal MAX_DOUBLE = new BigDecimal(Double.MAX_VALUE);
try{
BigDecimal bigInput = new BigDecimal(input);
return bigInput.compareTo(MAX_DOUBLE) < 1;
}catch(NumberFormatException e){
return false;
}
}
下面是一些测试上述方法的代码:
String[] inputs = {
"1E999999999999999999999999999999999999999999999999999999999999999999999999999999",
"1234",
"1.7976931348623157E308",
"1.79769313486231570E308",
"1.79769313486231571E308",
"1.79769313486231569E308",
"1E400"
};
for(String input: inputs){
System.out.println("input is: "+input);
System.out.println("is valid double? " + String.valueOf(isValidDouble(input)));
}
这是上述测试的结果输出:
input is: 1E999999999999999999999999999999999999999999999999999999999999999999999999999999
is valid double? false
input is: 1234
is valid double? true
input is: 1.7976931348623157E308
is valid double? true
input is: 1.79769313486231570E308
is valid double? true
input is: 1.79769313486231571E308
is valid double? false
input is: 1.79769313486231569E308
is valid double? true
input is: 1E400
is valid double? false
推荐阅读
- c# - 第一次执行的两个等效 LINQ 查询总是运行较慢
- c# - 无法读取或执行 GoogleServicesJson 文件:MainActivity.cs
- java - Spring ApplicationContext加载后,有什么方法可以扫描所有@Component(如带注释的类)
- python - Random.Choice() 正在返回整个字符串
- vue.js - 如何在Vue中从axios返回响应
- floating-point - 现代计算机中的数字以什么格式表示?
- curl - 使用 CURL 进行 OAuth 的语法格式错误
- node.js - 如何将 JWT 与 redis 的刷新令牌一起使用?丢失的
- python - 是否可以在 Keras 神经网络的顺序模型中计算层的梯度?
- r - 使用 mutate 从字符向量创建多个变量