Excel Round函数的等价性

我有这样一个数字: 3206.6186522022

我已经使用了一个Excel表格公式:

 ROUND(3206.6186522022;-2) 

这给了我: 3200

那么我怎样才能在c#中实现相同的?

这是一个示例LINQPad程序,演示了一种方法。 我通过在Excel中运行所有这些数字来validation它的行为是否一样:

 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), 3210).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), 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(-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); } 

作为参考,这个代码也可以工作(根据相同的testing数据进行检查):

 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; }