Прикольные числа Double


3 0

На работе у парня возникла проблема, он не мог никак получить нужное число при округлении вещественного числа. Он долго не мог понять, почему следующий пример не дает правильного ответа:

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.


Понравилось? Кликни Лайк, чтобы я знал, какой контент более интересен читателям. Заметку пока еще никто не лайкал и ты можешь быть первым


Комментарии

Денис

17 Марта 2012

Вроде знал про это, но все равно познавательный пример


Ancort

17 Марта 2012

Помню нам говорили, про проверять на == вещественные числа - плохая практика. Только на больше-меньше.


scriprt

18 Марта 2012

Здравствуйте Михаил у меня вот такой вопрос к вам, о рекламе обучения Java на вашем сайте, вы сами пробывали смотреть или может это глупый вопрос с моей стороны и вы Java знаете и этим не заморачиваетесь?


Добавить Комментарий

Еще что-нибудь

Хотите найти еще что-то интересное почитать? Можно попробовать отфильтровать заметки на блоге по категориям.

О блоге

Программист, автор нескольких книг серии глазами хакера и просто блогер. Интересуюсь безопасностью, хотя хакером себя не считаю

Обратная связь

Без проблем вступаю в неразборчивые разговоры по e-mail. Стараюсь отвечать на письма всех читателей вне зависимости от страны проживания, вероисповедания, на русском или английском языке.

Пишите мне