Подтвердить что ты не робот

Проблема с преобразованием типа С++

Рассмотрим следующий код:

#include <iostream>

using namespace std;

int aaa(int a) {
    cout << a * 0.3 << endl;
    return a * 0.3;
}

int main()
{
    cout << aaa(35000);
}

Он печатает:

10500
10499

Почему вывод отличается?

У меня есть обходное решение для использования "return a * 3/10;" но мне это не нравится.

Edit:

Обнаружено, что выполнение "return float (a * 0.3)"; дает ожидаемое значение;

4b9b3361

Ответ 1

Результат 0.3 * 35000 - это число с плавающей запятой, чуть меньше 10500. При печати округляется до 10500, но при принуждении к int дробные цифры отбрасываются, в результате получается 10499.

Ответ 2

int * double выражение дает двойное, то, что печатает первое. Затем вы конвертируете в int измельчение оставшейся части (даже если она почти там, сидя на 10500-DBL_EPSILON) и передают ее обратно. Второй - это значение.

Преобразования float-int должны выполняться с осторожностью, лучше всего.

Ответ 3

a * 0.3 имеет тип double. Вызов внутри aaa вызывает

ostream& operator<< (double val);

тогда как один внешний вызов

ostream& operator<< (int val);

Вы получите предупреждение (если вы включите их - я предлагаю вам), что неявный отбор с double до int не рекомендуется.