Бывают случаи, когда программа, написанная на Java, не ведёт себя так, как ожидается. Особенно это заметно при работе с числами с плавающей точкой. Примером может быть использование метода Math.round()
, который округляет число с плавающей точкой до ближайшего целого.
Следующий пример демонстрирует типичную проблему:
double a = 0.5; double b = 0.49999999999999994; System.out.println(Math.round(a)); // 1 System.out.println(Math.round(b)); // 1
В этом примере оба числа округляются до 1, хотя второе число меньше 0.5 и интуитивно кажется, что оно должно было округлиться до 0.
Это происходит из-за погрешности при хранении чисел с плавающей точкой. В компьютерах числа с плавающей точкой хранятся в двоичной форме и не все десятичные дроби могут быть точно представлены в этом формате.
Когда мы задаём число 0.49999999999999994
, оно не хранится точно таким. Вместо этого, хранится наиболее близкое к нему число, которое может быть представлено в двоичной форме, и это число на самом деле чуть больше 0.5
. Поэтому, когда оно округляется с помощью Math.round()
, результатом становится 1
.
Подобные погрешности связаны с природой чисел с плавающей точкой и их представления в компьютерах. Это важно учитывать при работе с такими числами и планировании алгоритмов, которые на них основаны.
Добавить комментарий