На работе у парня возникла проблема, он не мог никак получить нужное число при округлении вещественного числа. Он долго не мог понять, почему следующий пример не дает правильного ответа:
if ((int)(double.parse("19.99") * 100 )== 1999) { Счастье } else { Что за фигня }
Он никак не мог понять, почему он постоянно оказывается в блоке «что за фигня», вместо счастье. Я говорю ему, что числа double никогда не хранятся точно, они хранятся долбанутом приблизительном формате. После double.parse("19.99") вы никогда не получите double число 19.99. Вместо этого вы получите что-то типа 19.9899999991. Именно так хранится double число в памяти компьютера.
Если умножить на 100, то уже получается 1998.99999991 и Если его округлить до целого числа, то все нормально, вы получаете 1999, но если просто привести к int, т.е. банально отбросить все, что находится после запятой, то результатом будет 19.98. Немного конфузно, сказал бы Конфуцио и был бы прав. Я не помню уже природы этого явления, но такое оно достаточно давно.
Чтобы не заморачиваться с округлениями, можно использовать decimal. У него числа хранятся нормально, без мусора. То есть в результате decimal.parse("19.99") будет 19.99, а не 19.99999991.
Понравилось? Кликни Лайк, чтобы я знал, какой контент более интересен читателям. Заметку пока еще никто не лайкал и ты можешь быть первым
Вроде знал про это, но все равно познавательный пример
Помню нам говорили, про проверять на == вещественные числа - плохая практика. Только на больше-меньше.
Здравствуйте Михаил у меня вот такой вопрос к вам, о рекламе обучения Java на вашем сайте, вы сами пробывали смотреть или может это глупый вопрос с моей стороны и вы Java знаете и этим не заморачиваетесь?
Хотите найти еще что-то интересное почитать? Можно попробовать отфильтровать заметки на блоге по категориям.