2013-08-28 44 views
1

如何計算C#十進制類型的精度位數?計數精確位數

例如12.001 = 3個精確數字。

我想拋出一個錯誤是一個大於x的精度存在。

謝謝。

+0

所以如果你除以2得到6.0005那麼應該拋出一個異常?祝你好運,寫數學庫以配合這一點。 –

回答

2

你可以得到一個decimal的「規模」是這樣的:

static byte GetScale(decimal d) 
{ 
    return BitConverter.GetBytes(decimal.GetBits(d)[3])[2]; 
} 

說明:decimal.GetBits返回四個int值的數組,其中我們只取最後一個值。正如鏈接頁面所述,我們只需要從構成此int的四個字節中的第二個到最後一個byte,我們用BitConverter.GetBytes來完成。

示例:3.14m的比例尺爲23.14000m的比例是5123456m的比例是0123456.0m的比例是1


如果代碼可以大端系統上運行,它是可能,你必須修改到BitConverter.GetBytes(decimal.GetBits(d)[3])[BitConverter.IsLittleEndian ? 2 : 1]或類似的東西。我沒有測試過。請參閱下面的相關評論。

+0

這仍然可以在一個不同的排序系統上工作嗎? –

+0

@relatively_random不確定。 .NET是否在大端系統上運行.NET的實現?我想我們必須從.NET的那些實現中查閱'decimal.GetBits'和'BitConverter.GetBytes'的文檔,以確定它們的輸出是否依賴於字節順序。我看到Microsoft .NET有一個字段「BitConverter.IsLittleEndian」,我不知道他們是否構建了大端架構的框架。相關:[關於Endian-ness和.Net的詳細信息](http://stackoverflow.com/questions/3162986/) –

+1

根據你的鏈接,有一些big-endian的.NET實現。根據[MSDN](https://msdn.microsoft.com/en-us/library/system.bitconverter.aspx),BitConverter對字節順序非常敏感。我會解釋什麼是寫有關[Decimal.GetBits](https://msdn.microsoft.com/en-us/library/system.decimal.getbits.aspx),它會產生相同的輸出,無論機器。所以應該修改該方法來檢查BitConverter.IsLittleEndian並且如果爲false則獲取字節索引1。 –

3
public int CountDecPoint(decimal d){ 
    string[] s = d.ToString().Split('.'); 
    return s.Length == 1 ? 0 : s[1].Length; 
} 

通常情況下,小數點分隔符是.,但對付不同的文化,這個代碼會更好:

public int CountDecPoint(decimal d){ 
    string[] s = d.ToString().Split(Application.CurrentCulture.NumberFormat.NumberDecimalSeparator[0]); 
    return s.Length == 1 ? 0 : s[1].Length; 
} 
+0

不過,如果你打了很多電話,這並不會奏效。 – BanksySan

0

我知道我正在復活一個古老的問題,但這裏的版本不依賴於字符串表示,實際上忽略了尾隨零。當然,如果這是需要的話。

public static int GetMinPrecision(this decimal input) 
{ 
    if (input < 0) 
     input = -input; 

    int count = 0; 
    input -= decimal.Truncate(input); 
    while (input != 0) 
    { 
     ++count; 
     input *= 10; 
     input -= decimal.Truncate(input); 
    } 

    return count; 
}