2010-10-31 37 views
3

考虑下面的C#代码舍入的数:使用非标准规则

Decimal number = new decimal(8.0549); 
Decimal rounded = Math.Round(number, 2); 
Console.WriteLine("rounded value: {0}", rounded); 

时会产生输出:8.05

Math.Round的algoritm只检查下一个数字超出作为参数的小数数。
我需要一个检查所有小数链的算法。在这种情况下,9应该轮4〜5这反过来将轮5至6,产生最终结果8.06

更多exemples:
8.0545 - > 8.06
8.0544 - > 8.05

有一些内置在该方法可以帮助我吗?
谢谢。

+4

我屁股你知道你提出的舍入在数学上是不正确的吗?即8.0545比8.06接近8.05,所以四舍五入到8.06是不正确的四舍五入。 – 2010-10-31 16:38:20

+2

只是好奇(因为你正在寻找的不是四舍五入的)......为什么? ;) – 2010-10-31 16:39:18

+1

是的,我知道这不是数学上正确的。那是因为我称它为“非标准”。但它仍然是一个四舍五入的,不是? :)我也不同意这个规则。但是上级命令.. – 2010-10-31 16:45:35

回答

1

否;你需要自己写。

1

我希望,如果有一个内置的方法来做到这一点,就已经被报道为错误;)

话虽这么说 - 你可以创建一个需要你的小数,随着方法最大和最小号的地方,从一轮反转,并在循环粉碎下来的希望的地方 - 即是这样的:

private static double NotQuiteRounding(double numToRound, int maxPlaces, int minPlaces) 
{ 
    int i = maxPlaces; 
    do 
    { 
     numToRound = Math.Round(numToRound,i); 
     i = i - 1; 
    } 
    while (i >= minPlaces); 

    return numToRound; 
} 

,并调用它是这样的:

Console.WriteLine(NotQuiteRounding(8.0545,10,2)); 
    Console.WriteLine(NotQuiteRounding(8.0544,10,2)); 
+2

只要不这样做,否则在例行的结束时,事情将被释放,孩子将被吃掉。 – 2010-10-31 16:48:54

+2

..确实......但在万圣节上想出这个是非常合适的,但:-) – 2010-10-31 16:51:12

+1

不应该''我减少而不是增加? – 2010-10-31 17:00:22