当浮点数小于1时,函数返回0

Function returns 0 when float number is under 1

本文关键字:函数 返回 1时 浮点数 小于      更新时间:2023-10-16

我有这个代码来计算二叉树主要分支之间的差异,重要的是最后一个。调试我得到最后一个表达式:

return difRama/total;

这将始终以百分比形式返回0到1之间的小数。我遇到这样的情况:

  • 返回5/15
  • 返回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,知道吗?

除法发生在从intfloat的隐式转换之前。

在除法之前,您需要从intfloat的显式强制转换。

return (float)  difRama / total;

您应该知道,根据运算符优先级规则,上面的强制转换适用于除法之前的difRama(而不是除法的结果)。

您正在用整数算术计算除法。如果除法中的两个参数都是整型,则会发生这种情况,而与结果所分配的变量类型无关。

一个简单的解决方案是将商预乘以1.0f:

返回1.0f * difRama / total;

这将强制将自变量提升为float s。

相反(我更喜欢),乘以1.0,这将迫使参数提升为double,并且当返回时,整个表达式将经历隐式的缩小转换为float

这是因为变量difRama和total都是int类型。如果结果有小数部分(第一种情况为0.33,第二种情况为0.4),它将被截断。但是,如果显式地将其中一个转换为float,则不会发生截断。像这样:

return static_cast<float>(difRama) / total;