Из-за чего вещественные числа искажаются, как бороться с этим?

long double tt = 0.3;
   int tmp;
   tt = tt * 10;
   tmp = tt;
   tt -= tmp;
   printf("%d\n", tmp);
   printf("%Lf\n", tt);

По логике от этого кода ожидается такой вывод на экран:
3
0.000000

Но по факту выводит такое:
2
1.000000

В тоже время если сделать так:
double tt = 0.3;
   int tmp;
   tt = tt * 10;
   tmp = tt;
   tt -= tmp;
   printf("%d\n", tmp);
   printf("%f\n", tt);

То выводиться все как положено.

Кто нибудь знает из-за чего это происходит и как с этим бороться?
  • Вопрос задан
  • 144 просмотра
Пригласить эксперта
Ответы на вопрос 3
MvcBox
@MvcBox
Software Developer [C/C++/JS(for Node.js)/etc]
Из-за чего вещественные числа искажаются

https://ru.wikipedia.org/wiki/IEEE_754-2008
Ответ написан
Комментировать
sergey-gornostaev
@sergey-gornostaev Куратор тега C
Седой и строгий
Ответ написан
Комментировать
wisgest
@wisgest
Не ИТ-специалист
1) Вещественные числа хранятся приближённо, по крайней мере десятичное 0.3 (в отличие, например, от 0.5) не может быть точно представлено конечной дробью в двоичной записи.
2) При присваивании вещественного целому дробная часть отбрасывается, а не производится округление к ближайшему целому.

как с этим бороться?
Округлять перед присваиванием целому (round, roundf, roundl).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы