#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. О, я вижу! я понял