В коде ниже вывод : "числа равны".
Scanner scanner = new Scanner (System.in);
double x = scanner.nextDouble();
double y = scanner.nextDouble();
if (Math.abs (y-x) < 0.000001)
System.out.println ("числа равны");
else
System.out.println ("числа не равны");
А в этом коде вывод: "числа не равны".
if (Math.abs (y-x) <= 0.000001)
System.out.println ("числа равны");
else
System.out.println ("числа не равны");
Linx
3 уровень
Почему разный вывод с "=" , и без "=" ?
Обсуждается
Комментарии (13)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
hjh
позавчера, 12:52
смотри, если будут введены числа 5 и 5.000001 то без равно выведет "числа равны" в другом же случае числа не будут равны
0
Dop
5 марта, 23:20
if (Math.abs (y-x) <= 0.000001
/если x-y меньше или равен 0.00001 то числа равны, еслт поставить просто = то это будет другое условие, если x-y равны 0.00001 то число равны, меньше нельзя
System.out.println ("числа равны");
else
System.out.println ("числа не равны");
+1
Linx
6 марта, 15:03
так в этом и вопрос!
почему при :
Math.abs(y-x) <= 0.000001
числа не равны
а так :
Math.abs(y-x) < 0.000001
равны
???????
0
ГоффMaster
6 марта, 16:26
Возможно (точно не знаю, погугли), что алгоритмы сравнения работают по-разному. Возможно, что при < машина учитывает возможные погрешности, а при <= сравнение производится строго.
Повторюсь - это только предположение.
+1
Dop
6 марта, 23:21
допустим x = 10, а y = 5, если потставить под условие где Math.abs(y-x) <= 0.000001 то получится что (y-x) будет равны -5, то есть числа не равны, но, так как условие задано как <=(меньше или равно) то условие будет положительное, то есть выведется в коде что числа равны, хотя это не так
+1
Linx
7 марта, 20:28
Согласен, через метод с модулем(Math.abs()), не учитывается отрицательное либо положительное число (5 ==(-5), вывод: (числа равны).
А в изначально придаставленом в вопросе коде при операторе "<=", вывод: числа не равны
0
ГоффMaster
5 марта, 22:40
Ну предположу, что в одном случае сравнивается по условию "меньше", а во втором "меньше или равно".
И там явно скобочек не хватает
+1
Linx
6 марта, 14:57
да, не заметил , что не хватает скобок, но на суть вопроса они не влияют.
по условию входные данные таковы:
0.000001
0.000002
0
ГоффMaster
6 марта, 16:23
А ты понимаешь, прости за вопрос, что при вычислениях с даблом всегда возникают погрешности? 0.000002 - 0.000001 примерно равно 0.000001. Но это не точно. Может быть равно, а может быть не совсем.
Пример: если мы в нашей десятичной системе 1 разделим на 3, а потом на 3 умножим, то у нас получится 0,99999999, а не 1. Когда мы дроби из десятичной переводим в двоичную и обратно, возникают погрешности, потому что не все значения двоичной системы можно точно передать десятичной и наоборот.
+1
Linx
7 марта, 20:33
Да, знаю про погрешность чисел с плавающей точкой.
По этой причине в задаче используется метод Math.abs()<0.000001
0
ГоффMaster
8 марта, 01:12
А погляди, чему равен Math.abs()
самому интересно стало.
+1
Linx
9 марта, 19:08
Гофф, а используя только телефон, я могу поглядеть?
0
ГоффMaster
9 марта, 22:09
Добавь в код отладочный вывод, который выводит интересуемое значение, и посмотри, что выведет. Скинешь, что там?
0