2014-01-21 100 views
0

我試圖做一個簡單的數學運算,如果一個值在兩個值之間,如果是這樣的話,它應該做一個簡單的除法。然而有時除以值是像0.9,0.6等等,並且總是返回0除以0.9 c#總是返回0

在這個例子中,

int m_LocationSqrMtr = 4339; 
float m_DefaultPricing = Convert.ToSingle(DefaultPricing); 
float m_manDays; 

if (m_LocationCosts > 450 && m_LocationCosts < 700) 
{ 
    m_DefaultPricing = 700/m_LocationSqrMtr;  
} 
+2

什麼是'm_LocationSqrMtr'? – SLaks

+0

整數除法在小數點後截斷。什麼類型的是m_LocationSqrMtr – Ric

+0

@SLaks大概比700更大,實際上它的'4339' – Jodrell

回答

9

我的猜測是,m_LocationSqrMtr類型是int,在這種情況下,這表示:

700/m_LocationSqrMtr 

...將利用整數算術來計算,並且將結果轉換爲float。我懷疑你想:

if (m_LocationCosts > 450 && m_LocationCosts < 700) 
{ 
    m_DefaultPricing = 700f/m_LocationSqrMtr;  
} 

f後綴的字面意思,這是一個float文字,所以首先m_LocationSqrMtr將晉升爲float,然後分割使用float算術執行。

然而,如果這意味着要代表貨幣值,你應該考慮使用decimal代替float - 然後可能捨入值,以小數點後2位。如果你把你所有的貨幣算術decimal,你就不太可能碰到意外的結果...

+0

嗨,謝謝你。我已經使m_DefaultPricing現在是一個小數,但它仍然返回0.當它是一個浮點數,使f工作(與瘋狂的小數)。但是你說的是對的。我如何使用小數來處理它? – TMB87

+2

@TomBeech:使用「m」後綴代替「f」代替小數。 –

0

如果m_LocationSqrMtr類型爲int,如在32位整數,則表達式

700/m_LocationSqrMtr 

是一個整數除以另一個整數,它的類型是整數。只有在這個整數產生是分配給float m_DefaultPricing結果,所以基本上你的代碼就相當於:

int temp = 700/m_LocationSqrMtr; 
m_DefaultPricing = (float) temp; 

如果要強制浮點運算,操作數的至少一個必須是一個浮點數。有多種方式,這是可以做到:

m_DefaultPricing = 700.0/m_LocationSqrMtr; //explicit decimal point 

m_DefaultPricing = 700f/m_LocationSqrMtr; //explicit float specification 

m_DefaultPricing = (float)700/m_LocationSqrMtr; //casting one operand 
m_DefaultPricing = 700f/(float)m_LocationSqrMtr; //into a float 
3

您有:

int m_LocationSqrMtr = 4339; 
[...] 
m_DefaultPricing = 700/m_LocationSqrMtr;  

也就是說,700/4339,這是(integer)/(integer),其結果是一個整數。

我知道你期待的回答是0.16132...

但在整數計算,該值ZERO

0

已經有一些很好的實際答案等更概念層次的:

在C#中,如果操作者的兩邊都是整數,結果也是整數和小數的任何數字被截斷。一般來說,對於數學,該語言將產生與具有最精確類型的輸入相同類型的結果。您存儲結果的變量類型將不會影響輸入的結果類型。

通過強制一個輸入爲十進制或浮點數,您強制輸出也是如此。在實踐中,你可以通過將你的一個輸入變量聲明爲十進制或浮點數(取決於你使用哪一個,在你的情況下你會改變m_LocationSqrMtr的類型),或者你有一個常量輸入(就像你這樣做)你可以強制它爲十進制/浮點/雙精度,如下所示:

var a = 10f // float 
var b = 10d // double 
var c = 10m // decimal 
var d = 10.0 // double I believe