【问题标题】:Java double Input ValidationJava 双输入验证
【发布时间】:2014-04-16 10:24:53
【问题描述】:

下面是代码:

    Scanner scan = new Scanner(System.in);
    String input = scan.next();
    try{
        double isNum = Double.parseDouble(input);
        if(isNum == Math.floor(isNum)) {
            System.out.println("Input is Integer");
             //enter a double again
        }else {
            System.out.println("Input is Double");
            //break
        }
    } catch(Exception e) {
        if(input.toCharArray().length == 1) {
            System.out.println("Input is Character");
             //enter a double again
        }else {
            System.out.println("Input is String");
            //enter a double again
        }
    }

取自这里:how to check the data type validity of user's input (Java Scanner class)

但是,当我输入 1.0 或 0.0 时,它仍然被认为是整数,1.0 不被认为是双精度数吗?

请大家帮忙,谢谢!

【问题讨论】:

  • 我建议将输入扫描为字符串,然后尝试将其解析为 int,如果成功,则为 int。如果不是,则尝试将其解析为浮点数
  • 在解析之前可以检查是否有字符点(.)来判断它是双精度还是整数
  • @maxx777 输入是字符串解析为双精度...

标签: java


【解决方案1】:

如果要将1.0 视为Double1 视为Integer,则需要使用input 变量,它的类型为String

Java 将始终以与Double y = 1.0 相同的方式处理Double x = 1(意味着1 是有效的Double),因此您将无法用代码区分它们。

由于您拥有输入的原始字符串表示形式,因此请使用正则表达式或其他一些验证来检查它。例如,double 的示例正则表达式模式看起来像 "[0-9]+(\.){0,1}[0-9]*" 和整数 "[0-9]+""\d+"

这是一个例子:

final static String DOUBLE_PATTERN = "[0-9]+(\.){0,1}[0-9]*";
final static String INTEGER_PATTERN = "\d+";

Scanner scan = new Scanner(System.in);
String input = scan.next();

if (Pattern.matches(INTEGER_PATTERN, input)) {
    System.out.println("Input is Integer");
    //enter a double again
} else if (Pattern.matches(DOUBLE_PATTERN, input)) {
    System.out.println("Input is Double");
    //break
} else {
    System.out.println("Input is not a number");
    if (input.length == 1) {
        System.out.println("Input is a Character");
        //enter a double again
    } else {
        System.out.println("Input is a String");
        //enter a double again
    }
}

【讨论】:

    【解决方案2】:

    1.0 通常被认为是有效的双精度数,但代码已明确写入威胁整数作为无效双精度数(打印它们是整数)。要更改此行为,请删除内部 if:

    try{
        double isNum = Double.parseDouble(input);
        System.out.println("Input is Double");
    } catch(Exception e) {
        if(input.toCharArray().length == 1) {
            System.out.println("Input is Character");
        }else {
            System.out.println("Input is String");
        }
    }
    

    【讨论】:

    • 让我看看它是否抛出错误,我认为它会接受整数作为有效,因为字符串 1 可以解析为 1.0?
    • 1 也是一个有效的双精度。我希望上面的代码能够成功用于类似的输入。
    • 如果 1 是有效的双精度数,那么我的问题就得到了回答。谢谢。
    • @user3540710,如果答案对您有用,您应该通过左侧的绿色勾号将其标记为正确
    【解决方案3】:

    检查,如果您正在验证的字符串包含一个点 - 那么,如果 parseDouble 成功,它可以被视为一个双精度值(即使是 1.0)。

    【讨论】:

      【解决方案4】:

      您检查 1.0 是否等于 1,这在数学上是正确的。因此,您的第一个 if 将返回 true,它将被视为 int。似乎该程序的整个想法是检查双打并查看它们是否有小数。

      【讨论】:

        【解决方案5】:
        Math.floor(x)
        

        返回一个双精度值,由于 1.0 确实与 1.0 相同,你的程序将进入第一个 if 块。

        【讨论】:

          【解决方案6】:

          我认为你的测试有缺陷。你说0.01.0被解析为整数”基于条件

          isNum == Math.floor(isNum)
          

          双精度浮点数不是比特的随机垃圾:它们表达了一个精确的数量,并且恰好可以表示数字 zeroone正好是(see the bit patterns),因此它们等于Math.floor(val)(顺便说一句,这发生在很多整数值上,不仅仅是零和一)

          因此,您应该您的代码之前重新考虑您的测试。考虑到用户可能永远不会输入 integerdouble:她输入的是 decimal 数字,您应该处理输入取决于它的用途(可以选择 String、BigDecimal、Number、Integer、Double 等...)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-07-01
            • 2013-11-28
            • 2016-05-18
            • 1970-01-01
            • 1970-01-01
            • 2013-04-18
            • 1970-01-01
            相关资源
            最近更新 更多