Я ввел правильное значение, но напечатано неправильное значение

#java

#java

Вопрос:

Я ввел правильное значение, но напечатано неправильное значение. (* Частное отображается с точностью до первого знака после запятой.)

 System.out.printf ("What is quotient of %d / %d ? ", n1, n2);
double answer1 = s.nextDouble();  //enter quotient

System.out.printf("What is remainder of %d / %d ? ", n1, n2);
double answer2 = s.nextDouble();  //enter remainder

if ((quotient == answer1) amp;amp; (((n1-(quotient*n2)) == answer2)))
  System.out.print("Correct!");

else {  System.out.print("Incorrect: ");  //error point I think
System.out.printf("%d / %d = %f, Remainder: %f n", n1, n2, quotient, (n1-(quotient*n2)));   }
  

Когда проблема равна 6/7, если я ввожу правильный ответ 0.8, а остальные 0.4, вместо «Правильно» отображается «Неверно: 6/7 = 0.800000, остаток: 0.400000»! Что мне делать?

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

1. Но 6/7 это не 0.8 так?

2. вместо сравнения с == вы можете вычислить разницу между двумя

3. ДА. Обычно 6/7 не равно 0,8, но в этой программе оно делится только до первой десятичной точки..

4. Что означает «вы можете вычислить разницу между ними». ? Я не понимаю.

Ответ №1:

Это связано с операциями с плавающей запятой и точностью. Разница может быть на 10-м месте после запятой. Поэтому вам не следует сравнивать значения с плавающими == значениями, но проверять, не превышает ли их разница определенного порога.

 double a = ...;
double b = ...;

if (Math.abs(a-b) < 0.0001) {
  //Consider as equal
} else { 
  //Consider as unequal
}
  

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

1. Благодаря вашей помощи я смог решить проблему. Ты потрясающий! B-)

Ответ №2:

Даже если две переменные с плавающей запятой (скажем, a amp; b) математически имеют одинаковое значение, их равенство может не возвращать true , т.е. a == b Может быть неверным. Следовательно, мы находим разницу, чтобы увидеть, незначительна ли разница. Итак, попробуйте следующее:

 import java.util.*;

class Solution{
    public static void main(String args[]){
        Scanner s = new Scanner(System.in);
        int n1 = 6, n2 = 7;

        System.out.printf ("What is quotient of %d / %d ? ", n1, n2);
        double answer1 = s.nextDouble();  //enter quotient

        System.out.printf("What is remainder of %d / %d ? ", n1, n2);
        double answer2 = s.nextDouble();  //enter remainder

        double num = answer1 * n2   answer2; //calculate user's number
        if (Math.abs(new Double(n1) - num) <= 0.1f)
            System.out.print("Correct!");
        else{
            System.out.print("Incorrect: ");  //error point I think
            double quotient = new Double(n1) / new Double(n2);
            double remainder = new Double(n1) - quotient * new Double(n2);
            System.out.printf("%d / %d = %f, Remainder: %f n", n1, n2, quotient, remainder);
        }
    }
}
  

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

1. Я не понимаю «новый двойной», потому что я новичок, но большое вам спасибо за ваши добрые ответы! Это действительно очень помогло: D

2. Он используется для преобразования int в double .

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

4. Да, вы тоже можете это сделать.

5. О, я вижу! я понял