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");
}