在c#中,Math.Round(2.5)的结果是2。

应该是3,不是吗?为什么在c#中它是2 ?


当前回答

默认的midpointround。ToEven,或者Bankers的舍入(2.5变成2,4.5变成4等等)曾经让我在写会计报告时感到苦恼,所以我将写几句话,讲述我以前和在这篇文章中研究的发现。

那些四舍五入到偶数的银行家是谁(也许是英国银行家!)?

从维基百科

“银行家”一词的起源 四舍五入仍然比较模糊。如果这 四舍五入法曾经是一种标准 银行业,证据已经证明 很难找到。到 相反,欧洲的第2节 委员会报告的介绍 欧元和货币四舍五入 数量表明有 以前没有标准的方法 银行业的四舍五入;而且它 指定“一半”的数量 应该被围捕。

这似乎是一种非常奇怪的四舍五入的方式,尤其是对银行业来说,当然,除非银行过去常常接受大量偶数的存款。押金240万英镑,但我们算200万英镑,先生。

IEEE标准754可以追溯到1985年,并给出了两种舍入方法,但标准推荐使用银行家的舍入方法。这篇维基百科的文章列出了一长串语言如何实现舍入(如果下面有任何错误请纠正我),大多数语言都不使用Bankers的舍入,而是你在学校教过的:

C/ c++ round() from math.h舍入到0(不是银行家舍入) Java数学。舍入从0取整(它将结果取整,加0.5,强制转换为整数)。BigDecimal中有一个替代方案 Perl使用与C类似的方法 Javascript与Java的Math.Round相同。

其他回答

从MSDN:

默认为Math。圆的使用 MidpointRounding.ToEven。大多数人 不熟悉“四舍五入? 甚至“作为替代”,四舍五入 “远离零”更常见 . net默认为 “四舍五入到偶数” 统计上的优势是因为 没有分享的倾向 四舍五入的意思是四舍五入 比它循环的频率稍高 向下(假设数字为 四舍五入往往是积极的。)

http://msdn.microsoft.com/en-us/library/system.math.round.aspx

使用自定义舍入

public int Round(double value)
{
    double decimalpoints = Math.Abs(value - Math.Floor(value));
    if (decimalpoints > 0.5)
        return (int)Math.Round(value);
    else
        return (int)Math.Floor(value);
}

舍入的性质

考虑一下将一个包含分数的数字四舍五入为整数的任务。在这种情况下,舍入的过程是确定哪个整数最能代表要舍入的数字。

在普通或“算术”四舍五入中,很明显2.1、2.2、2.3和2.4四舍五入到2.0;2.6 2.7 2.8 2.9到3.0。

剩下的是2.5,与2.0相比,它更接近3.0。2.0和3.0之间的选择取决于你,两者都是同样有效的。

对于负数,-2.1、-2.2、-2.3和-2.4会变成-2.0;而-2.6、2.7、2.8和2.9在算术四舍五入下会变成-3.0。

对于-2.5,需要在-2.0和-3.0之间进行选择。

其他形式的舍入

“四舍五入”取任何小数点后的数字,并使其成为下一个“整”数。因此,不仅2.5和2.6要四舍五入到3.0,2.1和2.2也要四舍五入到3.0。

四舍五入使正数和负数都远离零。2.5到3.0和-2.5到-3.0。

“舍入”通过砍掉不需要的数字来截断数字。这样做的效果是将数字移向零。2.5到2.0和-2.5到-2.0

在“银行家四舍五入”中——最常见的形式——要四舍五入的。5要么四舍五入,要么四舍五入,这样四舍五入的结果总是偶数。因此,2.5轮到2.0,3.5轮到4.0,4.5轮到4.0,5.5轮到6.0,以此类推。

'交替四舍五入'将任何。5的过程在四舍五入和四舍五入之间交替进行。

“随机舍入”是在完全随机的基础上舍入0.5上下的数值。

对称与不对称

一个舍入函数是“对称的”,如果它把所有的数字舍入到零,或者把所有的数字舍入到零。

如果将正数舍入为零,将负数舍入为零,则函数是“不对称的”。2.5到2.0;从-2.5到-3.0。

同样不对称的还有一个函数,它把正数舍入为零,把负数舍入为零。2.5至3.0;从-2.5到-2.0。

大多数时候,人们会想到对称舍入,即-2.5会舍入到-3.0,3.5会舍入到4.0。(在c# Round(AwayFromZero))

您应该检查MSDN中的Math。轮:

这种方法的行为遵循IEEE标准754,第4节。这种四舍五入有时被称为最接近四舍五入,或银行家四舍五入。

您可以指定Math的行为。使用重载进行四舍五入:

Math.Round(2.5, 0, MidpointRounding.AwayFromZero); // gives 3

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

这是非常丑陋的,但总是产生正确的算术四舍五入。

public double ArithRound(double number,int places){

  string numberFormat = "###.";

  numberFormat = numberFormat.PadRight(numberFormat.Length + places, '#');

  return double.Parse(number.ToString(numberFormat));

}