爲什麼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;
}
爲什麼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;
}
整數除法發生,那麼結果,是一個整數,分配爲浮動。如果結果小於1,那麼它結束爲0.
您將要在表達式之前將表達式轉換爲浮點數,例如,
float m = (float)(a.y - b.y)/(float)(a.x - b.x);
他確實的整數除法,這意味着四分之三= 0投括號中的一個浮動
(float)(a.y - b.y)/(a.x - b.x);
如果(AY - 通過)小於(斧 - BX), m
始終爲零。
就這樣施展它。
float m = ((float)(a.y - b.y))/((float)(a.x - b.x));
因爲(AY - 通過)可能是小於(斧 - BX)並在代碼鑄件除法運算後這樣做的結果是一個整數,那麼0
你應該投浮動在/操作之前
您需要使用強制轉換。我看到其他的答案,他們將真正的工作,但由於標籤是C++
我建議你使用static_cast
:
float m = static_cast< float >(a.y - b.y)/static_cast< float >(a.x - b.x);
你應該知道,在評估包含整數表達式時,臨時從結果評估的每個階段也被四捨五入爲整數。在您分配到float m
時,該值僅在整數算術運算後轉換爲支持實數的float
類型。這意味着,例如,3/4在變爲0.0之前已經是「0」值。您需要強制轉換爲更早發生。您可以通過使用語法float(value)
任何的a.y
,b.y
,a.x
,b.x
,a.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...
您對整數進行計算並分配其結果浮動。所以編譯器會隱式地把你的整數結果轉換成浮點數
..並且注意除以零! – GrahamS 2011-03-28 09:18:44
@GrahamS - 當我們談論浮點數時,除以0並不危險。你可以安全地將任何浮點數除以0.0或-0.0,會給你'inf'。但是,是的,如果這是意想不到的,它會導致問題。 – 2011-03-28 09:45:17
@Kiril Kirov:是的,它不會像整數除零那樣引起異常/崩潰,但它會給你帶來'+ INF','-INF'或'NaN',這可能會導致OP進一步當他嘗試使用'm'時出現問題。 (:) – GrahamS 2011-03-28 09:51:04