2011-03-28 83 views
19

爲什麼m總是= 0? SomeClass的x和y成員是整數。C++ int float casting

float getSlope(someClass a, someClass b) 
{   
    float m = (a.y - b.y)/(a.x - b.x); 
    cout << " m = " << m << "\n"; 
    return m; 
} 

回答

37

整數除法發生,那麼結果,是一個整數,分配爲浮動。如果結果小於1,那麼它結束爲0.

您將要在表達式之前將表達式轉換爲浮點數,例如,

float m = (float)(a.y - b.y)/(float)(a.x - b.x); 
+4

..並且注意除以零! – GrahamS 2011-03-28 09:18:44

+0

@GrahamS - 當我們談論浮點數時,除以0並不危險。你可以安全地將任何浮點數除以0.0或-0.0,會給你'inf'。但是,是的,如果這是意想不到的,它會導致問題。 – 2011-03-28 09:45:17

+0

@Kiril Kirov:是的,它不會像整數除零那樣引起異常/崩潰,但它會給你帶來'+ INF','-INF'或'NaN',這可能會導致OP進一步當他嘗試使用'm'時出現問題。 (:) – GrahamS 2011-03-28 09:51:04

0

他確實的整數除法,這意味着四分之三= 0投括號中的一個浮動

(float)(a.y - b.y)/(a.x - b.x); 
0

如果(AY - 通過)小於(斧 - BX), m始終爲零。

就這樣施展它。

float m = ((float)(a.y - b.y))/((float)(a.x - b.x)); 
0

因爲(AY - 通過)可能是小於(斧 - BX)並在代碼鑄件除法運算後這樣做的結果是一個整數,那麼0

你應該投浮動在/操作之前

41

您需要使用強制轉換。我看到其他的答案,他們將真正的工作,但由於標籤是C++我建議你使用static_cast

float m = static_cast< float >(a.y - b.y)/static_cast< float >(a.x - b.x);
+0

我不一定不同意,但是對立點:(1)這是不太可讀的,(2)便攜性較差 – notlesh 2017-12-09 19:38:40

+0

@notlesh - 「不太便攜」以什麼方式? – 2017-12-10 18:06:52

+0

即它不能直接移植到C ...再次,只是一個對位:) – notlesh 2017-12-10 18:09:44

1

你應該知道,在評估包含整數表達式時,臨時從結果評估的每個階段也被四捨五入爲整數。在您分配到float m時,該值僅在整數算術運算後轉換爲支持實數的float類型。這意味着,例如,3/4在變爲0.0之前已經是「0」值。您需要強制轉換爲更早發生。您可以通過使用語法float(value)任何的a.yb.ya.xb.xa.y - b.y,或a.x - b.x做到這一點:沒關係,當它只要條件之一是浮動的劃分發生之前,例如做

float m = float(a.y - b.y)/(a.x - b.x); 
float m = (float(a.y) - b.y)/(a.x - b.x); 
...etc... 
0

您對整數進行計算並分配其結果浮動。所以編譯器會隱式地把你的整數結果轉換成浮點數