我有这个代码来计算二叉树的主要分支之间的差异,重要的是最终的。调试我到达最后一个表达式:
return difRama/total;
这将始终返回0到1之间的小数,以百分比表示。 我得到的情况如下:
返回4/10
float Arbol::diferenciaRamas(pnodo rama1, pnodo rama2){
int total, difRama, pesoIzq, pesoDer;
/* Calculamos pesos rama izq yder*/
pesoIzq = pesoRamificaciones(rama1);
pesoDer = pesoRamificaciones(rama2);
/* Diferencia de peso entre ramas */
difRama = abs(pesoIzq - pesoDer);
/* Total de peso del arbol */
total = (pesoIzq+pesoDer);
/* Si el total es 0 o la diferencia es 0 */
if(total == 0 || difRama == 0)
return 0;
/* Porcentaje de diferencia */
return difRama / total;
}
问题是函数总是返回0,任何想法?
答案 0 :(得分:6)
从int
到float
的隐式转换
在分割之前,您需要从int
到float
进行明确演员。
return (float) difRama / total;
您应该通过运算符优先级规则知道上面的转换在除法之前应用于difRama
(而不是除法的结果)。
答案 1 :(得分:1)
你用整数算术计算除法。如果除法中的两个参数都是整数类型,则无论分配结果的变量类型如何,都会发生这种情况。
一个简单的解决方法是将商预先乘以1.0f
:
返回1.0f * difRama / total;
将强制将参数提升为float
s。
Altenatively(我更喜欢),乘以1.0
,这会强制将参数提升为double
,并且当整个表达式将进行隐式缩小转换为float
时返回。
答案 2 :(得分:1)
那是因为变量difRama和total都是int类型。如果结果有一个小数部分(第一种情况为0.33,第二种情况为0.4),则会被截断。但是如果你明确地将其中一个转换为float,那么就不会发生截断。像这样:
return static_cast<float>(difRama) / total;