2012-02-21 32 views
11

我有一個Double值小數點後:尋找的名額的雙

double a = 4.5565; 

是什麼(在這種情況下4)小數點後計算的位數的最簡單方法。

我知道我可以轉換爲字符串,並做一個分割,並採取長度。但有沒有更簡單的方法?

+0

你所說的 「容易」 是什麼意思?我懷疑從書寫/閱讀的角度來看有什麼更容易的,但是例如在CPU操作方面可能更容易一些。 – Snowbear 2012-02-21 23:01:40

+2

這實際上並不可行。 HTTP://en.wikipedia。org/wiki/Double-precision_floating-point_format – SLaks 2012-02-21 23:02:27

+2

'a'的值可能不完全是4.5565。如果你不明白爲什麼,我建議你閱讀:http://csharpindepth.com/Articles/General/FloatingPoint.aspx – 2012-02-21 23:03:05

回答

17

有沒有簡單的方法,特別是因爲從數學角度來說數字的數量可能遠遠超過顯示。例如,4.5565實際上存儲爲4.556499999999999772626324556767940521240234375(感謝harold用於計算)。你很難找到解決這個問題的有效方法。

編輯

可以想出一些算法是這樣工作的:圓形,如果像你計算十進制表示,你會發現一定數量的連續787-9(或零),你(或向下)到9s(或0)系列開始之前的最後一個地方。我懷疑你會發現比你預期的更麻煩。

+0

@harold謝謝,我沒有時間自行解決它。 – phoog 2012-02-21 23:27:22

+0

@phoog我同意你說的一般,但你對我的答案有什麼看法? – 2012-02-21 23:29:46

+0

@DorCohen我現在沒有時間深入瞭解您的答案。我會在今晚或明天早上看看。 – phoog 2012-02-21 23:32:48

3

我想字符串溶液是最好的:((a-(int)a)+"").length-2

+0

而不是拆分,你只是不計算字符串中的「0」。與blitzkriegz的解決方案 – 2012-02-21 23:10:47

+0

@ L.B沒什麼不同,但在我的解決方案中不需要分配數組。它會好一點。 – james 2012-02-21 23:22:32

+4

添加「」是調用'ToString()'的真正可怕的選擇。 – 2012-02-21 23:43:14

7
var precision = 0; 
var x = 1.345678901m; 

while (x*(decimal)Math.Pow(10,precision) != 
     Math.Round(x*(decimal)Math.Pow(10,precision))) 
    precision++; 

precision將等於的十進制值的顯著數字的數目(x設置爲1.23456000將導致5精密即使8位數字是最初在文字中指定)。這在時間上與小數位數成比例地執行。它只計算小數位數;您可以通過取Math.Log10(x)的整數部分來計算小數點左邊的位數。它最適用於小數點,因爲它們具有更好的值精度,因此舍入誤差更小。

+0

您的解決方案非常優雅,謝謝 – 2017-02-07 09:47:54

3

寫一個函數

int CountDigitsAfterDecimal(double value) 
     { 
      bool start = false; 
      int count = 0; 
      foreach (var s in value.ToString()) 
      { 
       if (s == '.') 
       { 
        start = true; 
       } 
       else if (start) 
       { 
        count++; 
       } 
      } 

      return count; 
     } 
-2

有一個非常好的文章地處STSdb論壇:Number of digits after decimal point. 它總結了許多已知的實現 - 的ToString(),10方法等較先進的方法的權力。提供比較測試,其顯示哪種方法是最快的。提供的解決方案適用於雙精度和十進制類型。

+2

鏈接已損壞 – berkeleybross 2015-12-21 20:02:12

+0

當前網址顯示爲:http://stssoft.com/forum/threads/462-Number-of-digits-after-decimal-point但是,內容被阻擋在註冊牆後面,所以我無法驗證內容。 – 2016-08-24 20:53:32

+0

@Kris對於斷開的鏈接,您的答案不再有用。請修復或刪除。 – 2017-01-04 04:25:07

0

我也許會使用此代碼,如果我需要,

myDoubleNumber.ToString("R").Split('.')[1].Length 

"R"這裏是Round Trip Format Specifier

我們需要檢查該指數範圍首先當然。

0

我認爲這可能是一個解決方案:

private static int getDecimalCount(double val) 
{ 
    int i=0; 
    while (Math.Round(val, i) != val) 
     i++; 
    return i; 
} 

double val9 = 4.5565d; int count9 = getDecimalCount(val9);//result: 4 

很抱歉的重複 - >https://stackoverflow.com/a/35238462/1266873