【问题标题】:Is it possible to raise a Decimal to an integer power in .NET?是否可以在 .NET 中将 Decimal 提高到整数幂?
【发布时间】:2015-04-13 00:57:32
【问题描述】:

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

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

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

我正在考虑类似Math.Pow 的东西,但它似乎不适用于十进制类型。我也在考虑一个在循环中进行乘法的简单函数,但如果 .NET 框架中已经存在某些东西,那么我宁愿使用它。

【问题讨论】:

  • 您可以使用Math.Pow,然后将结果大小写为decimal
  • 这不是一个数字的幂
  • @Kevin,10000 = 10^4。
  • 但是 10000 不是小数
  • @ArturoTorresSánchez 因为即使它存在也没有意义stackoverflow.com/questions/6425501/…

标签: c# .net decimal


【解决方案1】:

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

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

【讨论】:

    【解决方案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 以外的任何东西,因为性能变化很小。

    【讨论】:

    • 问题是关于使用小数。
    • 我更新了代码以使用小数作为值。然而,这是一个相当微不足道的变化。该代码仅显示将小数乘以整数幂,这似乎是 OP 所要求的。
    • 我没有投反对票。这只是我对否决票最合理的猜测。
    • 我明白了。我没有生气,只是真的很困惑。不过感谢您的建议。
    【解决方案3】:

    在将其提高到幂后将其转换为小数。

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

    【讨论】:

      猜你喜欢
      • 2021-09-09
      • 1970-01-01
      • 2016-03-28
      • 2012-09-15
      • 1970-01-01
      • 2018-12-14
      • 2022-11-02
      • 2015-11-17
      • 1970-01-01
      相关资源
      最近更新 更多