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

时间:2015-12-23 13:34:07

标签: c++ floating-point

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

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,任何想法?

3 个答案:

答案 0 :(得分:6)

intfloat的隐式转换

之前

在分割之前,您需要从intfloat进行明确演员。

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;