Вот в чем проблема: напишите программу, которая запрашивает длины сторон треугольника и сообщает о трех углах.
Я написал для него следующий код:
public static void main(String[] args) {
Scanner console = new Scanner(System.in);
System.out.print("Please input length of side A: ");
int sideA = console.nextInt();
System.out.print("Please input length of side B: ");
int sideB = console.nextInt();
System.out.print("Please input length of side C: ");
int sideC = console.nextInt();
System.out.println();
System.out.println("The angle between A and B is: " + calculateAngle(sideA, sideB, sideC));
System.out.println("The angle between B and C is: " + calculateAngle(sideB, sideC, sideA));
System.out.println("The angle between C and A is: " + calculateAngle(sideC, sideA, sideB));
}
public static double calculateAngle(int a, int b, int c) {
return Math.toDegrees(Math.acos((a * a + b * b - c * c) / (2 * a * b)));
}
Вот пример вывода из моего кода выше:
Please input length of side A: 55
Please input length of side B: 22
Please input length of side C: 76
The angle between A and B is: 90.0
The angle between B and C is: 90.0
The angle between C and A is: 90.0
Независимо от того, какие значения я ввожу для сторон, единственные углы, которые я когда-либо получаю, составляют 90 или 180 градусов, а не фактический правильный угол, который можно рассчитать по правилу косинусов. Что не так с моим кодом?
Просто приведите расчет от Math.acos
к double
:
return Math.toDegrees(Math.acos((double)(a * a + b * b - c * c) / (2 * a * b)));
Как вы могли видеть в комментариях, при вычислении между несколькими типами int
используется арифметика integer
, которая затем приводится к double
.
Также стоит отметить, что int
всегда округляется в меньшую сторону, что означает:
int i = 0.9999999; // i = 0
Согласно документации, они ожидают двойное значение в качестве параметра для acos
метода JavaSE7 Math doc
поэтому перестройте свой код следующим образом
public static void main(String[] args) {
Scanner console = new Scanner(System.in);
System.out.print("Please input length of side A: ");
double sideA = console.nextDouble();
System.out.print("Please input length of side B: ");
double sideB = console.nextDouble();
System.out.print("Please input length of side C: ");
double sideC = console.nextDouble();
System.out.println();
System.out.println("The angle between A and B is: " + calculateAngle(sideA, sideB, sideC));
System.out.println("The angle between B and C is: " + calculateAngle(sideB, sideC, sideA));
System.out.println("The angle between C and A is: " + calculateAngle(sideC, sideA, sideB));
}
public static double calculateAngle(double a, double b, double c) {
return Math.toDegrees(Math.acos((a * a + b * b - c * c) / (2 * a * b)));
}
Чтобы уточнить комментарий @Aplet123 - целочисленное деление означает, что
acos
в вашем расчете всегда дается ноль, что составляет 90 градусов. Измените переменные наfloat
илиdouble
или приведите результат к вычислению.