Java: Ошибка при прохождении тестов 'Unparseable number: "no"'

Есть задачка :

"напишите программу для решения квадратных уравнений".
Условия ввода/вывода стандартны.

мое решение:

    Scanner scanner = new Scanner(System.in).useLocale(Locale.US);

    double a = scanner.nextDouble();
    double b = scanner.nextDouble();
    double c = scanner.nextDouble();

    double bRoot = -b;
    double discriminant = b * b - 4 * a * c;
    double rootPlus = (bRoot + (Math.sqrt(discriminant))) / (2 * a);
    double rootMinus = (bRoot - (Math.sqrt(discriminant))) / (2 * a);

    if (a > 0) {
        if (discriminant == 0) {
            System.out.println(rootPlus);
        } else if (discriminant > 0) {
            System.out.println(rootMinus + " " + rootPlus);
        } else if (discriminant < 0) {
            System.out.println("no roots");
        }
    } else if (a < 0) {
        System.out.println("no roots");
    }
}

}

Но при прогоне тестов выдает непонятную ошибку

Tests run: 14, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.317 s <<< FAILURE! - in com.epam.rd.autotasks.QuadraticEquationTest
test2Roots{String, String}[4]  Time elapsed: 0.019 s  <<< ERROR!
java.lang.RuntimeException: java.text.ParseException: Unparseable number: "no"
    at com.epam.rd.autotasks.QuadraticEquationTest.parseNumber(QuadraticEquationTest.java:145)
    at com.epam.rd.autotasks.QuadraticEquationTest.parseRoots(QuadraticEquationTest.java:111)
    at com.epam.rd.autotasks.QuadraticEquationTest.test2Roots(QuadraticEquationTest.java:59)
Caused by: java.text.ParseException: Unparseable number: "no"
    at com.epam.rd.autotasks.QuadraticEquationTest.parseNumber(QuadraticEquationTest.java:143)
    at com.epam.rd.autotasks.QuadraticEquationTest.parseRoots(QuadraticEquationTest.java:111)
    at com.epam.rd.autotasks.QuadraticEquationTest.test2Roots(QuadraticEquationTest.java:59)

При переходе на QuadraticEquationTest.java:59 показывает:

@ParameterizedTest
@MethodSource("testCases2Roots")

void test2Roots(final String input, final String expected) {
    setControlledStreamsWithInput(input);
    try {
        QuadraticEquation.main(new String[]{});
        controlledOut.flush();

        double[] expectedRoots = parseRoots(expected);
        double[] actualRoots = parseRoots(getActualOutput());

        assertArrayEquals(expectedRoots, actualRoots, 0.00001, "Error on input " + input);
    } finally {
        setStandardStreams();
    }
}

Не могу сам разобраться, вроде все тесты пройдены, но ошибка есть.


Ответы (1 шт):

Автор решения: MBo

Как это вы вычисляете корни Math.sqrt(discriminant), презрев знак детерминанта?

Сначала необходимо проверить if (discriminant >= 0), и только при положительном исходе считать rootPlus и rootMinus.

А вот от знака коэффициента a наличие решений напрямую не зависит.

double discriminant = b * b - 4 * a * c;
if (discriminant > 0) {
   double rootPlus = (bRoot + (Math.sqrt(discriminant))) / (2 * a);
   double rootMinus = (bRoot - (Math.sqrt(discriminant))) / (2 * a);
   System.out.println(rootMinus + " " + rootPlus);
 } else if (discriminant == 0) {
        System.out.println(-b/ (2 * a));
 } else {
        System.out.println("no roots");
 }
→ Ссылка