Вычисленные углы с трех сторон показывают только 90 или 180 градусов

Вот в чем проблема: напишите программу, которая запрашивает длины сторон треугольника и сообщает о трех углах.

Я написал для него следующий код:

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 градусов, а не фактический правильный угол, который можно рассчитать по правилу косинусов. Что не так с моим кодом?

Чтобы уточнить комментарий @Aplet123 - целочисленное деление означает, что acos в вашем расчете всегда дается ноль, что составляет 90 градусов. Измените переменные на float или double или приведите результат к вычислению.

stridecolossus 13.12.2020 14:56
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Просто приведите расчет от 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)));
    }

Другие вопросы по теме