2010-07-19 11 views
8

की दशमलव परिशुद्धता का निर्धारण करें हमारे पास एक दिलचस्प समस्या है जिसे हमें उपयोगकर्ता इनपुट (टेक्स्टबॉक्स) की दशमलव परिशुद्धता निर्धारित करने की आवश्यकता है। अनिवार्य रूप से हम में प्रवेश किया दशमलव स्थानों की संख्या पता करने के लिए और फिर एक सटीक संख्या लौटने की जरूरत है, यह सबसे अच्छा उदाहरण के साथ स्पष्ट किया जाता है:इनपुट संख्या

4500 में प्रवेश किया एक परिणाम 1
4500.1 दर्ज की गई एक परिणाम के 0.1
4500.00 में प्रवेश किया निकलेगा निकलेगा होगा एक परिणाम 0.01
4500.450 परिणामस्वरूप 0.001

हम, तार के साथ काम करने के लिए सोच रहे हैं दशमलव विभाजक खोजने और उसके बाद परिणाम की गणना निकलेगा में प्रवेश किया उपज। बस सोच रहा है कि इसके लिए कोई आसान समाधान है या नहीं।

+3

क्या आप सुनिश्चित हैं कि 4500 1 होगा, और 100 नहीं? – corsiKa

+0

0.0 और 0.1 के मामले में अपेक्षित परिणाम क्या है? – user1785960

+0

मेरे लिए यह भ्रमित प्रश्न है। आप दशमलव परिशुद्धता के लिए नहीं पूछते हैं। आप पूछते हैं: अंश भाग में अंकों की संख्या कैसे प्राप्त करें। 'दशमलव परिशुद्धता' के लिए परिभाषा मेरे लिए यहां है: https://docs.oracle.com/cd/B28359_01/server.111/b28318/datatype.htm#i16209 – user1785960

उत्तर

8

चूंकि आपके अंतिम उदाहरण इंगित करते हैं कि पिछली ज़ीरो महत्वपूर्ण हैं, मैं किसी भी संख्यात्मक समाधान को रद्द कर दूंगा और स्ट्रिंग ऑपरेशंस के लिए जाऊंगा।

3

नहीं, कोई आसान समाधान नहीं है, आपको स्ट्रिंग की जांच करनी है। यदि आप "4500" और "4500.00" संख्याओं में कनवर्ट करते हैं, तो वे दोनों 4500 मान बन जाते हैं ताकि आप यह नहीं बता सकें कि दशमलव विभाजक के पीछे कितने गैर-मान वाले अंक थे।

1

स्ट्रिंग के साथ काम करना काफी आसान है।

यदि कोई नहीं है "।" स्ट्रिंग में, वापसी 1.

अन्य वापसी "0.", उसके बाद एन -1 "0", उसके बाद एक "1", जहां दशमलव बिंदु के बाद स्ट्रिंग की लंबाई है।

+0

चेतावनी: पहले सुनिश्चित करें कि स्ट्रिंग एक मान्य संख्या/है अंतिम चरित्र एक "।" नहीं है – luiscubal

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

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 प्रकार भंडार एक आंतरिक precission मूल्य। इसलिए आप Deciml.TryParse() का उपयोग कर सकते हैं और लौटाए गए मूल्य का निरीक्षण कर सकते हैं। शायद पार्सिंग एल्गोरिदम इनपुट की सटीकता को बनाए रखता है।

अंत में मैं फ्लोटिंग पॉइंट नंबरों का उपयोग करके कुछ कोशिश करने का सुझाव नहीं दूंगा। बस इनपुट को पार्स करने से पीछे की ओर शून्य के बारे में कोई जानकारी निकल जाएगी। इसलिए आपको उन्हें संरक्षित करने या समान चाल करने के लिए एक कलात्मक गैर-शून्य अंक जोड़ना होगा। आप सटीक मुद्दों में भाग सकते हैं। आखिर में एक फ्लोटिंग पॉइंट नंबर के आधार पर सटीकता को ढूंढना भी आसान नहीं है। मैं कुछ बदसूरत गणित या एक लूप को प्रत्येक पुनरावृत्ति के साथ गुणा करता हूं जब तक कि कोई अंशकालिक भाग न हो। और पाश नई precission मुद्दों के साथ आता है ...

अद्यतन

एक deciaml कार्यों में पार्स। विवरण के लिए से 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 के लिए दशमलव। प्रेसिजन, मुझे नहीं पता था कि यह ऐसा कर सकता है :) http://stackoverflow.com/questions/1132765/adjusting-decimal-precision-net –

+1

देखें क्योंकि ओपी ने "एक आसान समाधान" के लिए कहा था, और शायद अनुमानित " बेहतर प्रदर्शन ", यह स्ट्रिंग को पार्स करने के लिए प्रदर्शन-वार की तुलना कैसे करता है? –

+0

इसके लिए धन्यवाद! –

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

डैनियल ब्रुकनर का जवाब सीधे इस जानकारी तक पहुंचने के लिए देखें। – Brian

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

+0

कूल, टिप के लिए धन्यवाद। –

संबंधित मुद्दे