为什么m总是= 0? someClass的x和y成员是整数。
float getSlope(someClass a, someClass b)
{
float m = (a.y - b.y) / (a.x - b.x);
cout << " m = " << m << "\n";
return m;
}
答案 0 :(得分:53)
你需要使用演员表。我看到了其他答案,它们确实会有效,但由于代码为C++
,我建议你使用static_cast
:
float m = static_cast< float >( a.y - b.y ) / static_cast< float >( a.x - b.x );
答案 1 :(得分:43)
发生整数除法,然后将结果(整数)指定为float。如果结果小于1,则结果为0。
在分割之前,您需要先将表达式转换为浮点数,例如
float m = (float)(a.y - b.y) / (float)(a.x - b.x);
答案 2 :(得分:1)
您应该知道,在评估包含整数的表达式时,每个评估阶段的临时结果也会舍入为整数。在您对float m
的赋值中,该值仅在整数运算后转换为具有实数的float
类型。这意味着,例如,3/4在变为0.0之前已经是“0”值。您需要强制转换浮动才能更早发生。您可以在float(value)
,a.y
,b.y
,a.x
,b.x
或{{1}中使用a.y - b.y
语法来执行此操作只要其中一个术语在分裂发生之前是一个浮点数就完成它并不重要,例如
a.x - b.x
答案 3 :(得分:0)
他执行整数除法,这意味着3/4 = 0.将其中一个括号转换为浮动
(float)(a.y - b.y) / (a.x - b.x);
答案 4 :(得分:0)
如果(a.y - b.y)小于(a.x - b.x),m
始终为零。
所以这样投吧。
float m = ((float)(a.y - b.y)) / ((float)(a.x - b.x));
答案 5 :(得分:0)
因为(a.y - b.y)可能小于(a.x - b.x)并且在你的代码中,转换是在除法运算之后完成的,所以结果是一个整数,所以为0。
你应该在/ operation
之前强制转换为float答案 6 :(得分:0)
您正在对整数执行计算并将其结果指定给float。因此编译器会隐式将整数结果转换为float
答案 7 :(得分:0)
进行整数除法时,除非一个或多个操作数为浮点数,否则结果始终为整数。只需将操作数中的一个/两个都强制转换为浮点数,编译器就会进行转换。当您希望算术运算应按其应有的方式使用类型转换时,结果将是正确的数据类型。
float m = static_cast<float>(a.y - b.y) / (a.x - b.x);
答案 8 :(得分:0)
您可以通过乘以 (1.0) 来转换分子和分母。