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

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

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

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

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

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

Войти через центр авторизации
Похожие вопросы
АКМЭ сервис Санкт-Петербург
от 120 000 ₽
Кликнет Санкт-Петербург
До 150 000 ₽
Технология Екатеринбург
от 100 000 до 200 000 ₽
05 апр. 2020, в 13:34
8000 руб./за проект
05 апр. 2020, в 12:19
3000 руб./за проект
05 апр. 2020, в 12:11
35000 руб./за проект