首页 > 解决方案 > Java 解析字符串以进行双重溢出检查

问题描述

我正在写一个计算器演示。计算器接受用户输入(字符串)并进行一些计算。第一步是将字符串解析为双精度。

我正在使用 NumberUtils.isParsable()Double.parseDouble()。但是,我想限制用户输入,以便双数不会溢出。似乎parseDouble()只检查字符串是否为数字。我没有找到任何检查字符串值的方法。

我想知道这样做的最佳方法是什么。

标签: javadouble

解决方案


您可以使用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

推荐阅读