2014-02-28 57 views
-3

導致所以我有一些代碼,基本上讀取:數學是錯誤的:永遠的0

int foo = bar * (percentage/100); 

其中foo代表欄的百分比。所以,如果bar是100,百分比是20,我們會預期20/100 = 0.2,所以100 * 0.2 = 20 ...但這不是發生了什麼。每一次,沒有失敗富= 0我想也許這不是一個整數,「所以我嘗試:

float foo = bar * (percentage/100); 

富仍然爲0,任何幫助,將不勝感激,因爲我從來沒有在數學有了很大,但我敢肯定,我沒有錯此位的是

+2

什麼是bar和什麼是百分比? – abatishchev

+0

整數是整數只使用另一個數據類型,如小數,雙精度或浮點數 –

+0

bar是一個數字。百分比是一個百分比 - 一個介於0和100之間的數字.foo是百分比數字。這聽起來像是我在重複自己,但是我真的沒有其他辦法可以做到。 – Joe

回答

1

表達(percentage/100)爲整數類型,因此會0,只要結果舍入爲0.

如果將表達式中的某個數字更改爲處理小數的類型。表達式將評估爲該類型。

(percentage/100.0) 

,然後那表情也將是同類型的,而不是int當你bar相乘。

另外,您可以更改執行

int foo = (bar * percentage)/100; 

的順序會有一些精度損失,但你不應該得到0,除非bar * percentage小於100爲好。

+0

哦邏輯! 100是不同於100.0的數字當然!謝謝你,我一直在爲此撓頭太久。 – Joe

1

其更改爲十進制float foo = bar * (percentage/100.0);

+0

就像我說過的,我試過了,foo仍然是0。 – Joe

+1

@Joe你確定嗎?這與你的例子不一樣。注意'100.0'。'.0'有所作爲。 –

+0

我甚至沒有考慮過100和100.0會有不同的表現,當我學習數學時他們絕對不會這樣做。 – Joe

0

試試這個:

float foo = (float)bar * ((float)percentage/100.0); 

圍捕,這樣做:

in foo = (int)Math.Ceiling((float)bar * ((float)percentage/100.0)); 
+0

問題是,我不*真的*想要一個浮動。你不能有半個人...... – Joe

+1

然後再把它湊起來 – Coderchu

+0

@Joe:增加了「四捨五入」邏輯。 – Baldrick

0

這裏的問題是整數除法。你需要做的:

int foo = bar * (percentage/100.0); 

這就告訴你想要一個雙重或浮動後面的編譯器,而不是一個int,這將是0或1。

0

我覺得問題在(百分比/ 100)。它是整數,所以20/100 = 0. 源應該:var foo = bar *(p​​ercentage/100.0);

我希望這有幫助