Как исправить ошибки вычислений?

#java #computation

#java #вычисление

Вопрос:

Я пытаюсь написать программу, которая считывает 2 числа от пользователя и делит их. Вот код, который у меня есть на данный момент:

 import java.util.Scanner;

public class divideByZero {

public static int quotient(int numerator, int denominator)
{
   return numerator / denominator;
}

public static void main(String args[])
{
   Scanner scanner = new Scanner(System.in);

    System.out.print("Please enter the first number: ");

    int numerator = scanner.nextInt();

    System.out.print("Please enter the second number: ");

    int denominator = scanner.nextInt();

    int result = quotient( numerator, denominator );

    float result2 = (float)resu<

    System.out.printf("n The first number %d divided by the second number "
              "%d = %fn", numerator, denominator, result2 );

}
  

У меня проблемы с вычислениями. Например, когда я ввожу 3, разделенное на 4, я получаю результат 0.000000. Как мне получить правильный результат с точностью до 2 знаков после запятой?

Комментарии:

1. вероятно, проще просто использовать Scanner.nextFloat() вместо nextInt() и сохранять все данные в виде чисел с плавающей запятой, если вам нужен вывод с плавающей запятой.

Ответ №1:

Приведите числитель и знаменатель в виде чисел с плавающей запятой, прежде чем делить их.

 import java.util.Scanner;

public class divideByZero {

public static float quotient(float numerator, float denominator)
{
   return numerator / denominator;
}

public static void main(String args[])
{
   Scanner scanner = new Scanner(System.in);

    System.out.print("Please enter the first number: ");

    int numerator = scanner.nextInt();

    System.out.print("Please enter the second number: ");

    int denominator = scanner.nextInt();

    float result = quotient( (float) numerator, (float) denominator );

    System.out.printf("n The first number %d divided by the second number "
              "%d = %fn", numerator, denominator, result );

}
  

Комментарии:

1. Вероятно, он должен использовать double , как сказал Novazero.

2. Вероятно, поскольку он, вероятно, не превысит двойное ограничение, а float занимает больше места в памяти, но он использовал float в своем сообщении, поэтому я просто использовал то же самое.

3. Упс, никакое количество приведений не улучшит int отдачу от quotient (должно быть float quotient(float numerator, float denominator) ). Также не нужны приведения аргументов int.

4. Ах, пропустил int в функции. Кроме того, Java приводит параметры по умолчанию?

5. На самом деле, возможно, вы не сможете привести int к float неявно, так как это сужает приведение… но int должно привести к double просто отлично, что я уже сделал, чтобы указать, что это должно быть.

Ответ №2:

Следующие изменения сделают то, что вам нужно.

 public static float quotient(int numerator, int denominator)
{
    return (float)numerator / (float)denominator;
}

float result = quotient( numerator, denominator );

System.out.printf("n The first number %d divided by the second number "
          "%d = %.2fn", numerator, denominator, result2 );
  

Вы не можете выполнить деление на int и получить дробное значение int (такой вещи не существует), поэтому деление должно быть выполнено с плавающими значениями и сохранено в float . Значение %.2f ограничивает его двумя знаками после запятой.

Ответ №3:

Почему вы не используете тип данных double вместо float?

Вот некоторый код для форматирования в две десятичные точки:

 import java.text.*;

public class DecimalPlaces {

   public static void main(String[] args) {

       double d = 1.234567;
       DecimalFormat df = new DecimalFormat("#.##");
       System.out.print(df.format(d));
   }

}
  

Ответ №4:

Вы получаете 0.0000, потому что вы делите целые числа и сохраняете этот результат обратно в целое число. Чтобы увидеть дробную часть, вы можете объявить результат переменной с плавающей точкой.

Когда это работает, для печати 2 десятичных знаков вы можете использовать форматирование printf.

В C это было бы что-то вроде%.2f.

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

Ответ №5:

Если вы измените возвращаемый тип метода facotient с int на float , он больше не будет округлять ответ до ближайшего целого числа.

 public static float quotient(int numerator, int denominator)
{
   return (float) numerator / (float) denominator;
}