2014-01-20 25 views
6

回合100.11至100.15和100.16至100.20的C#回合100.11至100.15和100.16至100.20的C#

我已經嘗試了所有這些事情,但沒有這些幫助我。

Math.Round(100.11, 2,MidpointRounding.AwayFromZero); //gives 100.11 

Math.Round(100.11, 2,MidpointRounding.ToEven);//gives 100.11 

Math.Round((Decimal)100.11, 2)//gives 100.11 

(100.11).ToString("N2"); //gives "100.11" 

Math.Floor(100.11);// gives 100.0 

(100.11).ToString("#.##");//gives "100.11" 

Math.Truncate(100.11);// gives 100.0 

Math.Ceiling(100.11);//gives 101.0 

(100.11).ToString("F4");// gives "100.1100" 
+0

你試過'Math.Round(100.11,0)'嗎? – MusicLovingIndianGirl

+1

100.11至100.15 ??你的意思是100.10嗎? –

+0

@ Aishvarya Math.Round(100.11,0); 100.0 –

回答

4

問題需要樣品嚴重;如果一輪上漲與增量等於1/20預期,即:

100.10 -> 100.10 
    100.11 -> 100.15 // <- round UP; that's why 100.15 not 100.10 
    ... 
    100.15 -> 100.15 
    100.16 -> 100.20 
    ... 
    100.20 -> 100.20 
    100.21 -> 100.25 

你可以使用這個簡單的代碼

Double value = 100.11; 
    Double result = Math.Round(value * 20.0 + 0.49999999)/20.0; 
+0

+1表示該問題缺乏樣本。 – alzaimar

8

這應該得到期望的結果

decimal Round (decimal value, decimal granularity) 
{ 
    return Math.Ceiling(value/granularity+0.5M)*granularity; 
} 

// myResult = Round(110.11,0.05); 
// myResult = Round(110.16,0.05); 

一般:粒度設置爲你希望如何被四捨五入的值,例如十進制值0.1將四捨五入到最接近的小數。您也可以申請奇數值,如0.25,它們將輪到0.25,0.50,0.751.0

刪除+0.5M只會四捨五入到最接近的值(而不是四捨五入)。

+0

我在嘗試解決方案時遇到此錯誤Round(110.11,0.05); 'webapp1.test.Round(decimal,decimal)'的最佳重載方法匹配有一些無效參數 –

+0

您必須將它稱爲:「Round(110.11M,0.05M)」,因此編譯器會知道它必須用''decimal''參數調用該方法。 – moritzpflaum

+0

var s1 = Round(110.11M,0.05M)//給出110.15但是var s2 = Round(110.16M,0.05M); //給出110.2 –

0

由Alzaimar提供的答案是非常有趣和有用的。但請注意,在處理float或double值時它不是完全有用。

在一般情況下,你可以使用類似的方法來乾淨「Granularize」浮點值:

public double Granularize(double value, double granularity) 
{ 
    var precision = (Decimal.GetBits((decimal)value)[3] >> 16) & 0x000000FF; 
    return Math.Round(Math.Round(value/granularity, 0) * granularity, precision); 
} 

很明顯,你可以得出浮點/雙精度使用相同的基本前提天花板的方法。

我只是想指出,使用諸如0.1d這樣的粒度將不會給出正確的粒化結果,而不會導致粒度的精確性。你有時會在小數點後13位附近出現虛假的不精確。