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

С++ int float casting

Почему m всегда = 0? Члены x и y некоторых классов являются целыми числами.

float getSlope(someClass a, someClass b)
{           
    float m = (a.y - b.y) / (a.x - b.x);
    cout << " m = " << m << "\n";
    return m;
}
4b9b3361

Ответ 1

Выполняется целочисленное деление, тогда результат, который является целым числом, присваивается как float. Если результат меньше 1, то он заканчивается как 0.

Вы захотите перенести выражения на float сначала перед делением, например

float m = (float)(a.y - b.y) / (float)(a.x - b.x);

Ответ 2

Вам нужно использовать трансляцию. Я вижу другие ответы, и они действительно будут работать, но поскольку тег C++, я предлагаю вам использовать static_cast:

float m = static_cast&lt float &gt( a.y - b.y ) / static_cast&lt float &gt( a.x - b.x );

Ответ 3

Вы должны знать, что при оценке выражения, содержащего целые числа, временные результаты каждого этапа оценки также округляются до целых чисел. В вашем назначении float m значение после преобразования целочисленной арифметики преобразуется в тип float с реальным номером. Это означает, что, например, 3/4 уже будет значением "0", а затем станет 0.0. Вам нужно заставить конвертировать float, чтобы оно произошло раньше. Вы можете сделать это, используя синтаксис float(value) для любых a.y, b.y, a.x, b.x, a.y - b.y или a.x - b.x: не имеет значения, когда это выполняется, пока одним из терминов является поплавок до того, как произойдет деление, например

float m = float(a.y - b.y) / (a.x - b.x); 
float m = (float(a.y) - b.y) / (a.x - b.x); 
...etc...

Ответ 4

он выполняет деление целых чисел, что означает 3/4 = 0. литой один из скобок для float

 (float)(a.y - b.y) / (a.x - b.x);

Ответ 5

если (a.y - b.y) меньше (a.x - b.x), m всегда равно нулю.

поэтому сделайте это так.

float m = ((float)(a.y - b.y)) / ((float)(a.x - b.x));

Ответ 6

Потому что (a.y - b.y), вероятно, меньше (a.x - b.x), и в вашем коде кастинг выполняется после операции деления, поэтому результат является целым числом, поэтому 0.

Вы должны отбрасывать до float перед/operation

Ответ 7

Вы выполняете вычисления по целым числам и назначаете его результат для float. Таким образом, компилятор неявно преобразовывает ваш целочисленный результат в float