2015-04-13 47 views
-2

我在.NET(C#),我有一段代碼,基本上執行以下操作:是否有可能在.NET中將十進制數提升爲整數倍數?

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

然而,我無法使用10000直接因爲小數位的數目是可變的(在這種情況下,它被存儲爲4)。有沒有辦法可以用410000M

我在想像Math.Pow之類的東西,但它似乎並不適用於小數類型。我也在想一個簡單的函數,它可以在循環中進行乘法運算,但是如果.NET框架中已經存在某個函數,那麼我寧願使用它。

+1

您可以使用'Math.Pow',然後將結果格式爲'decimal'。 – MarcinJuraszek

+2

這不是將數字提高到一個數字 – Kevin

+1

@Kevin,10000 = 10^4。 –

回答

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

編輯:我只是跑一個測試來驗證倍。似乎Math.Pow現在比50以上的任何整數功率的基本循環更快。時間是最小的,但是當我做功率數學時,我經常進行大量的計算。

如果你正在做這個計算幾次,那麼除了Math.Pow以外,沒有必要使用任何其他的東西,因爲性能改變是最小的。

+0

可能你請解釋downvote? – druidicwyrm

+0

問題是關於用小數做這個問​​題。 – siride

+0

我更新了代碼以使用該值的小數。但是,這是一個相當微不足道的變化。該代碼只顯示了一個整數的小數點,這似乎是OP所要求的。 – druidicwyrm

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

有人可以解釋downvote嗎? – Kyle

1

只需將它提升至小數點後,將其提升至功率。

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