Я потратил почти весь день, пытаясь выяснить, почему это происходит, у меня был код, который увеличивал число с плавающей запятой, если оно не было целым числом, пока оно не стало целым числом, я запускал его, увеличивая значение на 0,01 и цикл продолжает увеличивать его на 0,01, пока оно не станет целым числом, но никогда не останавливается, отлаживая его, я заметил, что число становится все более неточным по мере продвижения цикла, что приводит к тому, что к концу оно составляет 0,0000066.
Я подумал, может быть, переменная могла иметь к нему каким-то образом обращались в другом месте, поэтому я создал его просто в пустой "основной" программе:
float value = 0;
for (int i=0; i<100; i++) {
value += 0.01f;
}
System.out.println(value); // Displays 0.99999934
System.out.println(value == 1); // Just in case it's displaying wrong in println (displays false)
Почему до конца не 1? Я не думаю, что это может иметь какое-либо отношение к типам данных, поскольку я добавляю float к float.
<= 100
приведет к 101 итерации. - person Dennis Meng   schedule 26.07.20130.01f
не «работает», и+
не «работает», но==
работает отлично. «Не используйте0.01f
и+
, если вы не понимаете, как они себя ведут» было бы намного лучше, чем «Не используйте==
». - person Pascal Cuoq   schedule 29.07.2013value += 0.01f;
наvalue = i * 0.01f;
делает условиеvalue == 1
истинным после цикла.==
никогда не ошибался в этом состоянии, только использовались0.01f
и+
. Замена этого использования опасных конструкций на что-то более продуманное исправляет программу. - person Pascal Cuoq   schedule 29.07.2013