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

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


当前回答

因为Silverlight不支持midpointrsurround选项,所以你必须自己编写。喜欢的东西:

public double RoundCorrect(double d, int decimals)
{
    double multiplier = Math.Pow(10, decimals);

    if (d < 0)
        multiplier *= -1;

    return Math.Floor((d * multiplier) + 0.5) / multiplier;

}

关于如何使用它作为扩展的例子,请参阅文章:.NET和Silverlight圆整

其他回答

默认的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相同。

使用自定义舍入

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

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

public double ArithRound(double number,int places){

  string numberFormat = "###.";

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

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

}

以下是我必须解决的方法:

Public Function Round(number As Double, dec As Integer) As Double
    Dim decimalPowerOfTen = Math.Pow(10, dec)
    If CInt(number * decimalPowerOfTen) = Math.Round(number * decimalPowerOfTen, 2) Then
        Return Math.Round(number, 2, MidpointRounding.AwayFromZero)
    Else
        Return CInt(number * decimalPowerOfTen + 0.5) / 100
    End If
End Function

尝试使用1.905和2个小数将如预期的那样给出1.91,但Math.Round(1.905,2,MidpointRounding.AwayFromZero)给出1.90!数学。对于程序员可能遇到的大多数基本问题,Round方法是绝对不一致和不可用的。我必须检查如果(int) 1.905 * decimalPowerOfTen =数学。四舍五入(数字* decimalPowerOfTen, 2)因为我不想四舍五入什么应该四舍五入下来。

因为Silverlight不支持midpointrsurround选项,所以你必须自己编写。喜欢的东西:

public double RoundCorrect(double d, int decimals)
{
    double multiplier = Math.Pow(10, decimals);

    if (d < 0)
        multiplier *= -1;

    return Math.Floor((d * multiplier) + 0.5) / multiplier;

}

关于如何使用它作为扩展的例子,请参阅文章:.NET和Silverlight圆整