我們有一個有趣的問題是我們需要確定用戶輸入(文本框)的小數精度。從本質上講,我們需要知道進入小數號碼,然後返回一個精確數字,這是最好的例子說明:確定輸入數字的小數精度
4500進入將產生結果1
4500.1進入將產生結果0.1
4500.00進入會產生結果0.01
4500.450輸入將產生結果0.001
我們正在考慮使用字符串,找到小數點分隔符,然後計算結果。只是想知道是否有更簡單的解決方案。
我們有一個有趣的問題是我們需要確定用戶輸入(文本框)的小數精度。從本質上講,我們需要知道進入小數號碼,然後返回一個精確數字,這是最好的例子說明:確定輸入數字的小數精度
4500進入將產生結果1
4500.1進入將產生結果0.1
4500.00進入會產生結果0.01
4500.450輸入將產生結果0.001
我們正在考慮使用字符串,找到小數點分隔符,然後計算結果。只是想知道是否有更簡單的解決方案。
由於您的最後一個例子表明尾部零點是重要的,我會排除任何數值解決方案並進行字符串操作。
不,沒有更簡單的解決方案,您必須檢查字符串。如果您將"4500"
和"4500.00"
轉換爲數字,則它們都會成爲值4500
,因此您無法確定小數點分隔符後面有多少非值數字。
使用字符串很容易。
如果沒有「。」在字符串中返回1.
否則返回「0」,後跟n-1「0」,接着是一個「1」,其中n是小數點後面的字符串長度。
警告:首先確保字符串是有效數字/最後一個字符不是「。」 – luiscubal 2010-07-19 14:25:46
只是想知道是否有一個更容易的 解決方案。
號
使用字符串:
string[] res = inputstring.Split('.');
int precision = res[1].Length;
要分割的字符需要是正確的小數分隔符 - [NumberFormatInfo.NumberDecimalSeparator](http://msdn.microsoft.com/en-us/library/system.globalization.numberformatinfo.numberdecimalseparator.aspx) – ChrisF 2010-07-19 14:27:39
我想你應該只是做你的建議 - 用小數點的位置。明顯的缺點可能是你必須自己考慮國際化。
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)
是直截了當的。
+1 For decimal.Precision,我不知道它可以做到這一點:)請參閱http://stackoverflow.com/questions/1132765/adjusting-decimal-precision-net – 2010-07-19 14:30:21
由於OP要求「更簡單的解決方案」,並可能推斷「更好的表現「,這是如何比較性能明智地解析字符串? – 2012-10-17 03:23:04
謝謝! – 2013-10-17 22:08:01
有趣的是,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
如果您在跟蹤輸入精度動機純粹是爲了輸入和輸出的原因,這可能足以解決你的問題。
請參閱Daniel Bruckner關於如何直接訪問此信息的答案。 – Brian 2010-07-19 19:44:11
這是使用字符串的可能解決方案;
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這看起來像它可能是有趣的,如果你想深入研究一些。
您需要使用[NumberFormatInfo.NumberDecimalSeparator](http://msdn.microsoft.com/en-us/library/system.globalization.numberformatinfo.numberdecimalseparator.aspx)才能獲取區域設置的正確小數點分隔符。 – ChrisF 2010-07-19 15:09:59
很酷,謝謝你的提示。 – 2010-07-19 15:11:24
你確定4500是1,而不是100? – corsiKa 2010-07-19 14:59:41
在0.0和0.1的情況下預期的結果是什麼? – user1785960 2016-06-06 08:43:29
對我而言,這是令人困惑的問題。你不要求小數精度。你問:如何獲得小數部分的位數。 'decimal precision'的定義適用於我:https://docs.oracle.com/cd/B28359_01/server.111/b28318/datatype.htm#i16209 – user1785960 2016-06-06 08:58:48