是否有可能在.NET中将Decimal提升为整数幂?

时间:2015-04-13 00:57:33

标签: c# .net decimal

我在.NET(C#)中,我有一段基本上执行以下操作的代码:

decimal value = decimal.Parse(s);
long result = (long)(value * 10000M);

但是,我不能直接使用10000,因为小数位数是可变的(在这种情况下,它存储为4)。有没有办法可以使用此410000M

我正在思考像Math.Pow这样的东西,但它似乎不适用于小数类型。我还想到了一个在循环中进行乘法的简单函数,但是如果.NET框架中已存在某些东西,那么我宁愿使用它。

3 个答案:

答案 0 :(得分:2)

我不喜欢使用Math.Pow,因为它使用通用数学方程,因此通常较慢(除非你使用的是小数指数,看起来你不是这样)。相反,我会写一个像这样的扩展方法:

public static long ToPower(this decimal val, int pow)
{
    decimal ret = 1;
    for(int i = 0; i < pow; i++)
        ret *= val;
    return (long)ret;
}

可以这样称呼:

myDecimal.ToPower(4);

编辑:我刚刚运行了一项测试来验证时间。对于50以上的任何整数幂,Math.Pow现在似乎比基本循环更快。时间很短,但是当我进行幂数学运算时,我经常进行大量计算。

如果您正在进行此计算几次,则除了Math.Pow之外不需要使用任何其他内容,因为性能变化很小。

答案 1 :(得分:1)

将它提升到电源后,将其强制转换为小数。

decimal value = decimal.Parse(s);
int power = 4;
long result = (long)(value * (decimal)Math.Pow(10, power));

答案 2 :(得分:0)

这是一种将小数提升为非负整数幂的简单方法。

public static decimal Pow( decimal x, int n )
{
    if( n < 0 )
    {
        throw new ArgumentOutOfRangeException( "n" );
    }

    decimal result = 1;
    decimal multiplier = x;

    while( n > 0 )
    {
        if( ( n & 1 ) > 0 ) result *= multiplier;
        multiplier *= multiplier;
        n >>= 1;
    }

    return result;
}