在c#中,Math.Round(2.5)的结果是2。
应该是3,不是吗?为什么在c#中它是2 ?
在c#中,Math.Round(2.5)的结果是2。
应该是3,不是吗?为什么在c#中它是2 ?
当前回答
简单的方法是:
Math.Ceiling(decimal.Parse(yourNumber + ""));
其他回答
简单的方法是:
Math.Ceiling(decimal.Parse(yourNumber + ""));
Silverlight不支持midpointrsurround选项。 下面是Silverlight的一个扩展方法,它添加了midpointrsurround枚举:
public enum MidpointRounding
{
ToEven,
AwayFromZero
}
public static class DecimalExtensions
{
public static decimal Round(this decimal d, MidpointRounding mode)
{
return d.Round(0, mode);
}
/// <summary>
/// Rounds using arithmetic (5 rounds up) symmetrical (up is away from zero) rounding
/// </summary>
/// <param name="d">A Decimal number to be rounded.</param>
/// <param name="decimals">The number of significant fractional digits (precision) in the return value.</param>
/// <returns>The number nearest d with precision equal to decimals. If d is halfway between two numbers, then the nearest whole number away from zero is returned.</returns>
public static decimal Round(this decimal d, int decimals, MidpointRounding mode)
{
if ( mode == MidpointRounding.ToEven )
{
return decimal.Round(d, decimals);
}
else
{
decimal factor = Convert.ToDecimal(Math.Pow(10, decimals));
int sign = Math.Sign(d);
return Decimal.Truncate(d * factor + 0.5m * sign) / factor;
}
}
}
来源:http://anderly.com/2009/08/08/silverlight-midpoint-rounding-solution/
这是非常丑陋的,但总是产生正确的算术四舍五入。
public double ArithRound(double number,int places){
string numberFormat = "###.";
numberFormat = numberFormat.PadRight(numberFormat.Length + places, '#');
return double.Parse(number.ToString(numberFormat));
}
首先,无论如何这都不是c#错误——而是。net错误。c#是一种语言——它不决定数学如何。实现了Round。
其次,不,如果你读了文档,你会发现默认的舍入是“舍入到偶数”(银行家的舍入):
Return ValueType: System.DoubleThe integer nearest a. If the fractional component of a is halfway between two integers, one of which is even and the other odd, then the even number is returned. Note that this method returns a Double instead of an integral type. RemarksThe behavior of this method follows IEEE Standard 754, section 4. This kind of rounding is sometimes called rounding to nearest, or banker's rounding. It minimizes rounding errors that result from consistently rounding a midpoint value in a single direction.
你可以指定Math。Round应该使用重载对中点进行四舍五入,重载取midpointrsurround值。这里有一个带有midpointround的重载,对应于每个没有midpointround的重载:
圆(Decimal,中角) 圆(双)/圆(双,中点) 圆(Decimal, Int32) /圆(Decimal, Int32,中角肌) 圆(Double, Int32) /圆(Double, Int32,中角)
这种默认选择是否得当则是另一回事。(midpointround只是在。net 2.0中引入的。在此之前,我不确定是否有任何简单的方法来实现所需的行为,而不是自己动手。)特别是,历史已经表明,这不是预期的行为——在大多数情况下,这是API设计中的大忌。我知道为什么银行家舍入是有用的…但这对许多人来说仍然是一个惊喜。
您可能有兴趣看看最近的Java等效枚举(RoundingMode),它提供了更多的选项。(它不只是处理中点。)
我有这个问题,我的SQL服务器四舍五入0.5到1,而我的c#应用程序没有。所以你会看到两种不同的结果。
这是一个int/long的实现。这就是Java的舍入方法。
int roundedNumber = (int)Math.Floor(d + 0.5);
这可能也是你能想到的最有效的方法。
如果你想保持双精度并使用十进制精度,那么实际上只是使用基于小数点后多少位的10指数的问题。
public double getRounding(double number, int decimalPoints)
{
double decimalPowerOfTen = Math.Pow(10, decimalPoints);
return Math.Floor(number * decimalPowerOfTen + 0.5)/ decimalPowerOfTen;
}
你可以输入一个负的小数点作为小数点,这也很好。
getRounding(239, -2) = 200