检查不需要的输入(错误处理)

时间:2016-08-26 16:31:24

标签: java loops error-handling

我想检查我的代码所需的输入是否正确所以我把很多if语句检查了要求,我无法弄清楚它为什么不起作用。它应该检查n是否小于或等于91和/或它是小数(我不希望我的输入也是)。这样,用户不会通过输入小数或高于91的数字来破坏程序。

while (Error == 1) {
    n = user_input.nextDouble();
    if ((n - Math.round(n) <= 0.9) && (n - Math.round(n) >= 0.1)) {
        System.out.println("Error: No Decimal points please, try again");
        continue;
    }
    if ((n - Math.round(n) <= 0.9) && (n - Math.round(n) >= 0.1) && (n > 91)) {
        System.out.println("Error: No Decimal points please, try again");
        System.out.println("Error: Number too high, try again");
        continue;
    }
    if (n > 91) {
        System.out.println("Error: Number too high, try again");
        continue;
    }
    if (n == Math.round(n)) {
        Error = 0;
    }
    if (n == 0) {
        break;
    }
}

出于某些原因,当我输入9.1或9.9时,它根本不做任何事情。这是空白的...... 我做了&gt; =应该检查它是否大于或等于&lt; =应该检查它是否小于或等于。这是错的吗?

2 个答案:

答案 0 :(得分:0)

如果是pip install pydotplus 9.1,则不满足任何条件。这就是为什么没有做到的原因。迭代循环并等待下一个双输入。

这里,主要罪魁祸首是9.9计算不准确。例如,在9.1的情况下:

n - Math.round(n)值等于0.09999999999999964。因此,条件n - Math.round(n)永远不会满足,如果达到阻止则不会。

答案 1 :(得分:0)

嗯,首先,您似乎只想要整数小于或等于91的输入。 你会说这个似乎很奇怪,但是然后使用Scanner的nextDouble()方法明确地获取双打。

有更好的方法可以检查整数...请参阅此问题What's the best way to check to see if a String represents an integer in Java?

无论哪种方式,我都会假设您打算坚持使用创新方法:

你是对的,在 常规数学 中,9.1轮到9,两者之间的差异小于或等于0.1。您的案例工作。

但欢迎来到Java浮点代数的世界! 这里的双打比较好。 我的意思是他们没有比较好吗?那么,'9.1'和'9'之间的差异实际上是 0.09999999999999964 ,而不是1。 当您使用基本比较器时,Java不会对此进行补偿,因此您的比较失败。

希望不会丢失!比使用常规比较运算符有更好的比较双精度的方法。 介绍...... Double.compare()!!您可以阅读该方法的javadoc,或者您可以到此处获取有关该方法的功能的信息:some reliable tutorial site

然而,如果输入9.0001 怎么办?即使比较按照您的预期进行,您的测试也会失败。你真的应该在这里重新思考你的数学。如同,请尝试这样做:

Double.compare((n - Math.round(n)),0.0) != 0)