Ответ 1
Результат 0.3 * 35000 - это число с плавающей запятой, чуть меньше 10500. При печати округляется до 10500, но при принуждении к int дробные цифры отбрасываются, в результате получается 10499.
Рассмотрим следующий код:
#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)"; дает ожидаемое значение;
Результат 0.3 * 35000 - это число с плавающей запятой, чуть меньше 10500. При печати округляется до 10500, но при принуждении к int дробные цифры отбрасываются, в результате получается 10499.
int * double
выражение дает двойное, то, что печатает первое.
Затем вы конвертируете в int
измельчение оставшейся части (даже если она почти там, сидя на 10500-DBL_EPSILON) и передают ее обратно. Второй - это значение.
Преобразования float-int должны выполняться с осторожностью, лучше всего.
a * 0.3
имеет тип double
. Вызов внутри aaa
вызывает
ostream& operator<< (double val);
тогда как один внешний вызов
ostream& operator<< (int val);
Вы получите предупреждение (если вы включите их - я предлагаю вам), что неявный отбор с double
до int
не рекомендуется.