2015-12-23 80 views
-1

我有這段代碼來計算二叉樹主分支之間的差異,重要的是最後一個。調試我得到最後一個表達式:當浮點數小於1時,函數返回0

return difRama/total; 

這將始終返回0和1之間的小數,以百分比表示。 我得到這樣的情況:

  • 回報5月15日
  • 回報十分之四

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

+1

在C++中,如何使用結果不會影響它的計算方式。你的函數返回一個'float'不會改變'difRama/total'的計算方式。 –

回答

6

該分割發生在之前intfloat的隱式轉換。

在劃分之前,您需要從intfloat進行明確演員表演。

return (float) difRama/total; 

您應該由上面鑄適用於difRama鴻溝(而不是對鴻溝的結果)之前,運算符優先級規則知道。

+0

澄清:該演員陣容適用於'difRama'。一旦'difRama'成爲'float',編譯器會將'total'轉換爲'float',以便分區的參數類型匹配。演員表不適用於表達本身; '(float)(difRama/total)'仍然會進行整數除法,然後將結果轉換爲'float'。 –

+0

@PeteBecker我正在評論我自己的帖子,以確定您的評論是否需要澄清。所以我想這個澄清是需要的。 – JSF

+1

另外,沒有「隱式演員」這樣的事情。強制轉換是您在源代碼中編寫的內容,以告訴編譯器進行轉換。編譯器也可以在沒有轉換的情況下轉換東西;這是一個隱含的**轉換**。 –

1

您正在計算整數運算中的除法。如果除法中的兩個參數都是整型,則會發生這種情況,而與結果分配的變量類型無關。

一個簡單的解決方法是通過1.0f預乘商:

回報1.0f * difRama/total;

這將迫使參數晉升爲float秒。

Altenatively(我喜歡),通過1.0相乘,這將迫使被提升到double的參數,並返回時整個表達式將經歷一個隱式收縮轉換到float

+4

^-2:p ......... –

+0

好吧,我只是連根拔起。我想人們更喜歡投入更多的數字。但是這種方法沒有問題。 –

+0

同意。我會用自己的演員,但我不明白爲什麼人們認爲這是無益的。 –

1

這是因爲變量difRama和total都是int類型。如果結果有小數部分(第一種情況下爲0.33,第二種情況下爲0.4),它將被截斷。但是,如果你明確地將其中的一個轉換爲浮動,則截斷不會發生。像這樣:

return static_cast<float>(difRama)/total; 
+1

雖然將兩者都轉換爲「float」會產生所需的結果,但只需要施放其中一個。編譯器會將另一個轉換爲匹配。 –