2014-01-16 41 views
3

我有一些這樣的:3206.6186522022相當於Excel的Round函數的

而且我使用了一個Excel工作表中公式爲:

ROUND(3206.6186522022;-2) 

這給了我:3200

所以,我怎麼能在c#中實現相同?

回答

3

下面是一個示例LINQPad程序,演示了一種實現方法。我測試了通過Excel中運行的所有這些數字來驗證它的工作方式:

void Main() 
{ 
    Verify(ROUND(3206.618652, 2), 3206.62).Dump(); 
    Verify(ROUND(3206.618652, 1), 3206.6).Dump(); 
    Verify(ROUND(3206.618652, 0), 3207).Dump(); 
    Verify(ROUND(3206.618652, -1),).Dump(); 
    Verify(ROUND(3206.618652, -2), 3200).Dump(); 

    Verify(ROUND(3207.618652, 2), 3207.62).Dump(); 
    Verify(ROUND(3207.618652, 1), 3207.6).Dump(); 
    Verify(ROUND(3207.618652, 0), 3208).Dump(); 
    Verify(ROUND(3207.618652, -1),).Dump(); 
    Verify(ROUND(3207.618652, -2), 3200).Dump(); 

    Verify(ROUND(3205.618652, 2), 3205.62).Dump(); 
    Verify(ROUND(3205.618652, 1), 3205.6).Dump(); 
    Verify(ROUND(3205.618652, 0), 3206).Dump(); 
    Verify(ROUND(3205.618652, -1),).Dump(); 
    Verify(ROUND(3205.618652, -2), 3200).Dump(); 

    Verify(ROUND(-3206.618652, 2), -3206.62).Dump(); 
    Verify(ROUND(-3206.618652, 1), -3206.6).Dump(); 
    Verify(ROUND(-3206.618652, 0), -3207).Dump(); 
    Verify(ROUND(-3206.618652, -1), -3210).Dump(); 
    Verify(ROUND(-3206.618652, -2), -3200).Dump(); 

    Verify(ROUND(-3207.618652, 2), -3206.62).Dump(); 
    Verify(ROUND(-3207.618652, 1), -3206.6).Dump(); 
    Verify(ROUND(-3207.618652, 0), -3207).Dump(); 
    Verify(ROUND(-3207.618652, -1), -3210).Dump(); 
    Verify(ROUND(-3207.618652, -2), -3200).Dump(); 

    Verify(ROUND(-3205.618652, 2), -3205.62).Dump(); 
    Verify(ROUND(-3205.618652, 1), -3205.6).Dump(); 
    Verify(ROUND(-3205.618652, 0), -3206).Dump(); 
    Verify(ROUND(-3205.618652, -1), -3210).Dump(); 
    Verify(ROUND(-3205.618652, -2), -3200).Dump(); 

    Verify(ROUND(3205.4, 0), 3204).Dump(); 
    Verify(ROUND(3205.6, 0), 3205).Dump(); 

    Verify(ROUND(-4.4, 0), -4).Dump(); 
    Verify(ROUND(-4.5, 0), -5).Dump(); 
    Verify(ROUND(-4.6, 0), -5).Dump(); 
    Verify(ROUND(4.4, 0), 4).Dump(); 
    Verify(ROUND(4.5, 0), 5).Dump(); 
    Verify(ROUND(4.6, 0), 5).Dump(); 
} 

public static string Verify(double value, double expected) 
{ 
    if (Math.Abs(value - expected) < 1e-8) 
     return string.Empty; 

    return value + " is not equal (enough) to " + expected; 
} 

public static double ROUND(double value, int decimals) 
{ 
    if (decimals < 0) 
    { 
     var factor = Math.Pow(10, -decimals); 
     return ROUND(value/factor, 0) * factor; 
    } 
    return Math.Round(value, decimals, MidpointRounding.AwayFromZero); 
} 
+0

它的工作..非常感謝..!! –

+1

@VishalSuthar對於某些值而言這並不完全正確。爲了解決這個問題,把'Math.Round(value,decimals);'改爲'返回Math.Round(value,decimals,MidpointRounding.AwayFromZero);'然後把ROUND(4.5,0)返回5。這將是正確的。 –

+0

我應該指出,差異的出現是因爲默認'Math.Round()'使用「銀行家舍入」(即,圓到最近的偶數),但Excel不會。通過指定'MidpointRounding.AwayFromZero',您可以像Excel一樣使用它。 –

1

僅供參考,這段代碼也可以(針對相同的測試數據檢查):

public static double Round(double value, int digits) 
{ 
    double pow = Math.Pow(10, digits); 
    return Math.Truncate(value * pow + Math.Sign(value)*0.5)/pow; 
}