Почему 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;
}
Почему 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;
}
Выполняется целочисленное деление, тогда результат, который является целым числом, присваивается как float. Если результат меньше 1, то он заканчивается как 0.
Вы захотите перенести выражения на float сначала перед делением, например
float m = (float)(a.y - b.y) / (float)(a.x - b.x);
Вам нужно использовать трансляцию. Я вижу другие ответы, и они действительно будут работать, но поскольку тег C++
, я предлагаю вам использовать static_cast
:
float m = static_cast< float >( a.y - b.y ) / static_cast< float >( a.x - b.x );
Вы должны знать, что при оценке выражения, содержащего целые числа, временные результаты каждого этапа оценки также округляются до целых чисел. В вашем назначении 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...
он выполняет деление целых чисел, что означает 3/4 = 0. литой один из скобок для float
(float)(a.y - b.y) / (a.x - b.x);
если (a.y - b.y) меньше (a.x - b.x), m
всегда равно нулю.
поэтому сделайте это так.
float m = ((float)(a.y - b.y)) / ((float)(a.x - b.x));
Потому что (a.y - b.y), вероятно, меньше (a.x - b.x), и в вашем коде кастинг выполняется после операции деления, поэтому результат является целым числом, поэтому 0.
Вы должны отбрасывать до float перед/operation
Вы выполняете вычисления по целым числам и назначаете его результат для float. Таким образом, компилятор неявно преобразовывает ваш целочисленный результат в float