Во-первых, давайте избавимся от пользовательского ввода как причины для этого - намного проще, если бы короткая, но полная программа содержала все необходимые нам данные:
public class Test {
public static void main(String args[]) {
showRoots(2.0, 10.0, 2.0);
showRoots(10.0, 1.0, 1.0);
}
private static void showRoots(double a, double b, double c) {
double discriminant = Math.sqrt(b * b - 4 * a * c);
if (discriminant > 0) {
System.out.println("There are no real roots ");
} else {
double root1 = (-b + discriminant) / (2 * a);
double root2 = (-b - discriminant) / (2 * a);
System.out.println("The roots are " + root1 + " and " + root2);
}
}
}
Это показывает два случая - один, где естьна самом деле являются корнями - но программа утверждает, что их нет - и тот, где действительно не являются настоящими корнями, но программа выводит их как NaN.Когда вы берете квадратный корень из отрицательного числа, результат равен NaN, поэтому он отображается.
Итак, проблема в том, как вы справляетесь с дискриминантом.Существуют настоящие корни, если b 2 - 4ac неотрицателен - но вы уже взяли квадратный корень в этой точке и полностью изменили природуусловие.
Итак, это должно быть:
private static void showRoots(double a, double b, double c) {
double discriminant = b * b - 4 * a * c;
if (discriminant < 0) {
System.out.println("There are no real roots ");
} else {
double discriminantRoot = Math.sqrt(discriminant);
double root1 = (-b + discriminantRoot) / (2 * a);
double root2 = (-b - discriminantRoot) / (2 * a);
System.out.println("The roots are " + root1 + " and " + root2);
}
}
Уроки для изучения:
- Если вы хотите продемонстрировать проблему, она помогает сохранить ее минимальной;использование жестко закодированных значений - хороший способ сделать это
- Будьте осторожны с порядком операций - в этом случае вы пытались определить что-то, используя неправильное значение, потому что вы слишком рано взяли квадратный корень
- Будьте осторожны с условиями и правильно ли вы их понимаете
РЕДАКТИРОВАТЬ: Как отмечено в комментариях, есть также различные особые случаи, которые следует учитывать, в том числе когдаa
равно 0, что в противном случае привело бы к делению на 0.