Это правильно. Обратите внимание, что Java не имеет к этому никакого отношения, проблема присуща математике с плавающей запятой в ANY языке.
Вы часто можете сойти с рук с проблемами на уровне класса, но это не сработает в реальном мире. Иногда это не сработает в классе.
Инцидент с давних времен в школе. Преподаватель вступительного класса поставил задачу по выпускному экзамену, которая оказалась для многих из лучших учеников настоящим испытанием - это не сработало, и они не знали, почему. (Я видел это как лаборанта, меня не было в классе.) Наконец некоторые начали просить меня о помощи, и некоторые исследования выявили проблему: их никогда не учили о врожденной неточности математики с плавающей запятой.
Теперь, есть два основных подхода к этой проблеме: метод грубой силы (который случайно работал в этом случае, так как он каждый раз допускал одни и те же ошибки) и более элегантный (который допускал разные ошибки и не работал). Любой, кто попробовал элегантный подход, ударил бы по кирпичной стене, не имея ни малейшего представления, почему. Я помог многим из них и застрял в комментарии, объясняющем, почему и связаться со мной, если у него есть вопросы.
Конечно, в следующем семестре я слышу от него об этом, и я в основном заполнил весь отдел простой маленькой программой:
10 X = 3000000
20 X = X + 1
30 If X < X + 1 goto 20
40 Print "X = X + 1"
Несмотря на то, что думал каждый преподаватель кафедры, это БУДЕТ прекратить. 3 миллиона семян просто для того, чтобы они заканчивались быстрее. (Если вы не знаете основы: здесь нет никаких уловок, просто исчерпывается точность чисел с плавающей запятой.)