Sergomen
@Sergomen
Просто делай добро и оно вернётся

Как «нормально» перевести float в int?

В этом коде есть одна проблема - при привдеении numberLast к типу int значение почемуто превращеется в целое число но на 1 меньше чем нужно. Почему так? И как это исправить?
#include <iostream>
#include <cmath>

using namespace std;

int main()
{
  float massiv[3][3] = { {1.1, 2.2, 9.9}, {3.3, 4.4, 5.5}, {6.6, 7.7, 8.8} };
  cout << "Before: " << endl;
  for (int i = 0; i < 3; i++)
  {
    for (int j = 0; j < 3; j++)
    {
      cout << massiv[i][j] << " ";
    }
    cout << endl;
  }

  cout << endl;
  cout << "After: " << endl;
  for (int i = 0; i < 3; i++)
  {
    for (int j = 0; j < 3; j++)
    {
      float number;
      float numberLast;
      numberLast = modff((massiv[i][j]), &number);
      cout << (int)(numberLast*10) << " ";
    }
    cout << endl;
  }
}
  • Вопрос задан
  • 842 просмотра
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Это и есть нормальное преобразование float в int - с округлением вниз.

Edit: Видимо, проблема в том, что 0.9 нельзя идеально точно представить в float. На самом деле там хранится что-то вроде 0.8999999.... При домножении на 10 и округлении вниз вы получите 8, а не 9.

Надо использовать округление к ближайшему - round.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@danSamara
Сначала вам нужно определиться, что такое "нормально" конкретно для вас.
Округлять можно:
  • Отбрасывая дробную часть
  • В большую сторону
  • В меньшую сторону
  • "Математически" - в большую при ошибке округления 1/2
  • "Бухгалтерски" - до ближайшего чётного, при ошибке округления 1/2


Вы используете первый вариант, но возможны и другие. Смотрите функции round(), ceil(), floor() и trunc().
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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