如何舍入2位小数的十进制数

时间:2011-11-03 17:23:19

标签: c# decimal rounding

我有2个十进制数字:

1999,9999
1999,99

如果我使用功能

decimal.Round(Temp, 2);

然后我有这些结果:

2000,00
1999,99

如何确保即使有1999,999999它也会转到1999,99而不是2000,00。

感谢。

5 个答案:

答案 0 :(得分:4)

舍入将始终使1999,999移至2000.听起来你想要截断。

你可以通过一些乘法/除法来做到这一点:

decimal TruncateToPlaces(decimal value, int places)
{
    decimal multiplier = Math.Pow(10m, places);
    return decimal.Truncate(value * multiplier) / multiplier;
}

然后你可以这样做:

decimal value = TruncateToPlaces(1999.9999, 2);

答案 1 :(得分:2)

您需要截断数字。一种方法是:decimal.Truncate(<number> * 100) / 100;

答案 2 :(得分:0)

decimal d = 1999.999999; //or any

int temp = d*100; //199999
decimal result = temp/(decimal)100; //199.99

答案 3 :(得分:0)

简而言之,答案是...... 1999,9999四舍五入到小数点后两位实际上是2000,00

有许多不同的舍入策略 - http://en.wikipedia.org/wiki/Rounding - 您可能想要了解它们。

但是如果你不想对值进行舍入而是想要截断它,那么这应该是你。 scale是10的幂,表示应该发生截断的位置。如果scale是负幂10(例如,10 -2 ),则截断将发生在小数点右边的许多数字。如果scale是非负数,则截断发生在小数点的左侧(例如,1 10 0 的比例将截断分数,scale为100(或10 2 )将截断100s位置右侧的所有内容,将1999.9999m转换为1900m。< / p>

decimal TruncateToHundredthsPlace( decimal value )
{
  const decimal scale = 0.01m ; // 10^-2
  decimal result = value - ( value % 0.01m ) ;
  return results ;
}

或者,您可以编写类似以下代码的方法。它适用于任何比例: scale 的负值截断小数点右边的许多位置;非零值截断小数点左侧。

public static decimal Truncate( decimal value , int scale )
{
    Decimal factor = Power(10,scale) ;
    decimal result = value - ( value % factor ) ;

    return result ;
}
private static decimal Power( int m , int n )
{
    if ( m < 1 ) throw new ArgumentOutOfRangeException("m") ;

    Decimal @base  = (decimal) m ;
    Decimal factor = 1m ; // m^0 = 1
    while ( n > 0 )
    {
        factor *= @base ;
        --n ;
    }
    while ( n < 0 )
    {
        factor /= @base ;
        ++n ;
    }
    return factor ;
}

以十进制计算10的幂是昂贵的。但是,两个简单的优化会加快速度:

  • 首先,在静态查找表中预先计算一些合理数量的10,即10 -10 -10 +10 。我创建一个带有负下限的decimal[]:然后检查指定的比例是否在查找表中只是检查比例值是否是数组的有效索引。如果是这样,请使用比例值作为索引拉出因子。

  • 第二个优化是在计算它们时缓存10个值的功效。如果您已经计算了该值,则不需要重新计算它,只需使用比例作为关键字从缓存中捕获它。

答案 4 :(得分:0)

试试这个:

Convert.ToDecimal(x.ToString("#.##"));