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

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);

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

Кто нибудь знает из-за чего это происходит и как с этим бороться?
  • Вопрос задан
  • 112 просмотров
Пригласить эксперта
Ответы на вопрос 3
wisgest
@wisgest
Слесарь холодной обработки металла
1) Вещественные числа хранятся приближённо, по крайней мере десятичное 0.3 (в отличие, например, от 0.5) не может быть точно представлено конечной дробью в двоичной записи.
2) При присваивании вещественного целому дробная часть отбрасывается.

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

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

Войти через центр авторизации
Похожие вопросы
от 1 000 до 1 800 usd.
PLANAR Челябинск
от 70 000 до 110 000 руб.
АКМЭ сервис Санкт-Петербург
от 130 000 руб.
17 сент. 2019, в 22:19
3000 руб./за проект
17 сент. 2019, в 20:46
952 руб./в час
17 сент. 2019, в 20:41
10000 руб./за проект