public class JavaRush {
public static void main(String[] args) {
double a = 1.000001;
double b = 1.000002;
double z = Math.abs(b - a);
System.out.println(z);
String c = (z==0.000001) ? "числа равны" : "числа не равны";
System.out.println(c);
}
}
Вывод:
1.000000000139778E-6
числа не равны
JavaEnjoyer!
12 уровень
Код во вложении. Почему так считает вещественные числа?
Обсуждается
Комментарии (3)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
ГоффMaster
22 октября 2024, 16:37
Так, попробую. Это из-за двоичной системы, в которой хранятся числа.
Вот смотри, в привычной нам десятичной системе нельзя точно отобразить 1/3. Лишь приблизительно - 0,333333333. Если мы в десятичной системе 1 поделим на 3, а потом умножим на 3, то мы получим 0,999999999, а не 1.
А вот в 12-ричной системе (в этом месте все посмотрели на часы) 1/3 будет точно 0,4. Значение, которое в 12-ричной системе отображается точно, при переводе в 10-чную оказывается приблизительным.
То-есть в системах счисления существуют дробные числа, которые просто невозможно точно отобразить.
Теперь к двоичной системе, в которой комп всё считает. В ней тоже далеко не все вещественные числа из десятичной системы отображаются точно. Поэтому вычисления с вещественными типами типа дабл дают лишь приблизительный результат с некоей погрешностью.
+1
JavaEnjoyer!
24 октября 2024, 14:00
Спасибо!
0
JavaEnjoyer!
12 ноября 2024, 12:31
День добрый, Гофф!
Спасибо тебе за пояснения. Я сам почитал про вещественные числа. Понял, что сравнивать их можно лишь с определенной точностью.
+1