2010-07-19 50 views
8

我們有一個有趣的問題是我們需要確定用戶輸入(文本框)的小數精度。從本質上講,我們需要知道進入小數號碼,然後返回一個精確數字,這是最好的例子說明:確定輸入數字的小數精度

4500進入將產生結果1
4500.1進入將產生結果0.1
4500.00進入會產生結果0.01
4500.450輸入將產生結果0.001

我們正在考慮使用字符串,找到小數點分隔符,然後計算結果。只是想知道是否有更簡單的解決方案。

+3

你確定4500是1,而不是100? – corsiKa 2010-07-19 14:59:41

+0

在0.0和0.1的情況下預期的結果是什麼? – user1785960 2016-06-06 08:43:29

+0

對我而言,這是令人困惑的問題。你不要求小數精度。你問:如何獲得小數部分的位數。 'decimal precision'的定義適用於我:https://docs.oracle.com/cd/B28359_01/server.111/b28318/datatype.htm#i16209 – user1785960 2016-06-06 08:58:48

回答

8

由於您的最後一個例子表明尾部零點是重要的,我會排除任何數值解決方案並進行字符串操作。

3

不,沒有更簡單的解決方案,您必須檢查字符串。如果您將"4500""4500.00"轉換爲數字,則它們都會成爲值4500,因此您無法確定小數點分隔符後面有多少非值數字。

1

使用字符串很容易。

如果沒有「。」在字符串中返回1.

否則返回「0」,後跟n-1「0」,接着是一個「1」,其中n是小數點後面的字符串長度。

+0

警告:首先確保字符串是有效數字/最後一個字符不是「。」 – luiscubal 2010-07-19 14:25:46

9

只是想知道是否有一個更容易的 解決方案。

使用字符串:

string[] res = inputstring.Split('.'); 
int precision = res[1].Length; 
+15

要分割的字符需要是正確的小數分隔符 - [NumberFormatInfo.NumberDecimalSeparator](http://msdn.microsoft.com/en-us/library/system.globalization.numberformatinfo.numberdecimalseparator.aspx) – ChrisF 2010-07-19 14:27:39

14

我想你應該只是做你的建議 - 用小數點的位置。明顯的缺點可能是你必須自己考慮國際化。

var decimalSeparator = NumberFormatInfo.CurrentInfo.CurrencyDecimalSeparator; 

var position = input.IndexOf(decimalSeparator); 

var precision = (position == -1) ? 0 : input.Length - position - 1; 

// This may be quite unprecise. 
var result = Math.Pow(0.1, precision); 

還有一件事你可以試試 - Decimal類型存儲一個內部精度值。因此您可以使用Deciml.TryParse()並檢查返回的值。也許解析算法維護輸入的準確性。

最後,我會建議不要嘗試使用浮點數的東西。只解析輸入將刪除有關尾隨零的任何信息。所以你必須添加一個人爲的非零數字來保存它們或者做類似的技巧。您可能會遇到精密問題。最後找到基於浮點數的精度並不簡單。我看到一些醜陋的數學或循環乘以十次迭代,直到不再有任何小數部分。而循環帶有新precission問題...

UPDATE

解析成deciaml作品。 Se Decimal.GetBits()瞭解詳情。

var input = "123.4560"; 

var number = Decimal.Parse(input); 

// Will be 4. 
var precision = (Decimal.GetBits(number)[3] >> 16) & 0x000000FF; 

從這裏使用Math.Pow(0.1, precision)是直截了當的。

+0

+1 For decimal.Precision,我不知道它可以做到這一點:)請參閱http://stackoverflow.com/questions/1132765/adjusting-decimal-precision-net – 2010-07-19 14:30:21

+1

由於OP要求「更簡單的解決方案」,並可能推斷「更好的表現「,這是如何比較性能明智地解析字符串? – 2012-10-17 03:23:04

+0

謝謝! – 2013-10-17 22:08:01

2

有趣的是,Decimal試圖維持用戶輸入的精度。例如,

Console.WriteLine(5.0m); 
Console.WriteLine(5.00m); 
Console.WriteLine(Decimal.Parse("5.0")); 
Console.WriteLine(Decimal.Parse("5.00")); 

擁有的輸出:

5.0 
5.00 
5.0 
5.00 

如果您在跟蹤輸入精度動機純粹是爲了輸入和輸出的原因,這可能足以解決你的問題。

+0

請參閱Daniel Bruckner關於如何直接訪問此信息的答案。 – Brian 2010-07-19 19:44:11

1

這是使用字符串的可能解決方案;

static double GetPrecision(string s) 
{ 
    string[] splitNumber = s.Split('.'); 
    if (splitNumber.Length > 1) 
    { 
     return 1/Math.Pow(10, splitNumber[1].Length); 
    } 
    else 
    { 
     return 1; 
    } 
} 

這裏有個問題; Calculate System.Decimal Precision and Scale這看起來像它可能是有趣的,如果你想深入研究一些。

+1

您需要使用[NumberFormatInfo.NumberDecimalSeparator](http://msdn.microsoft.com/en-us/library/system.globalization.numberformatinfo.numberdecimalseparator.aspx)才能獲取區域設置的正確小數點分隔符。 – ChrisF 2010-07-19 15:09:59

+0

很酷,謝謝你的提示。 – 2010-07-19 15:11:24