2012-05-18 84 views
-2

我在我的控制器下面的代碼:asp.net-MVC 3 C#Math.round不四捨五入像0.010000001或浮動0.2399999999997

private void setProgress(float value) 
    { 
     progress = (float)Math.Round(value,4); 
    } 

但當值是一樣的東西在標題中的數字(數字非常接近一個int)它不起作用,進度只是獲得原始值。

這是怎麼發生的?

+0

研究基本浮點信息。 –

+2

這個問題的一部分是'float'和'decimal'表示數字的方式。這並不意味着它本身並不是它。 –

回答

2

因爲1和24可能沒有完全用二進制浮點數表示,這取決於這些數字的計算方式。如果你需要一個真正的整數,繞着它然後將其轉換爲int:

private void setProgress(float value) 
{ 
    progress = Convert.ToInt32((float)Math.Round(value,0)); 
} 

,如果你需要比較一浮爲int(即使是恆定的一個,那麼差異比較一些非常少數:

private bool AreCloseEnoughToEqual(double d1, double d2) 
{ 
    const double _EPSILON = 0.00000001; 
    return Math.Abs(d1-d2) < _EPSILON; 
} 

如果需要顯示它,就好像它是一個整數,0位小數顯示出來:

Console.WriteLine("{0:N0}",d1); 
+0

問題是我需要一個浮點數,但如果int值只需要1.00或24.00 – mornaner

+0

@DStanley:你確定嗎?我認爲沒有任何小數部分的值可以用浮點數表示。至少有1個和24個都可以。 –

+0

其實我搞砸了,說23.9999995我應該說0.23999995。我正在取得進展* 100,以便稍後在屏幕上顯示它。 – mornaner