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