2009-07-05 20 views
13

आइए कहें कि उपयोगकर्ता से इनपुट दशमलव संख्या है, उदा। 5. (4 दशमलव अंक होने)। इसे स्वतंत्र रूप से संग्रहीत किया जा सकता है (int, double) आदिसी/सी ++ दशमलव की संख्या गिनती?

क्या कोई चालाक (या बहुत आसान) तरीका यह पता लगाने के लिए कि कितने दशमलव हैं? (थोड़े सवाल के समान आप कैसे पाते हैं कि पिछली बिट मास्किंग करके एक संख्या भी अजीब है या अजीब है)।

+0

क्या आप स्पष्ट कर सकते हैं "संख्या कितनी दशमलव है"? क्या आपका मतलब है, संख्या के आंशिक भाग में कितने दशमलव अंक हैं? – Doug

+0

हां, आपकी धारणा सही है। – Milan

उत्तर

15

दो तरीके मैं, न तो बहुत दुर्भाग्य से चतुर के बारे में पता है, लेकिन इस और अधिक पर्यावरण की एक सीमा मुझे के बजाय है :-)

पहले sprintf"%.50f" प्रारूप स्ट्रिंग के साथ एक बड़े बफर की संख्या है, पीछे की ओर शून्य को बंद करें, फिर दशमलव बिंदु के बाद वर्णों को गिनें। यह printf परिवार द्वारा ही सीमित होगा। या आप उपयोगकर्ता द्वारा इनपुट के रूप में स्ट्रिंग का उपयोग कर सकते हैं (sprintf फ्लोटिंग पॉइंट मान में डालने के बजाय), ताकि फ़्लोटिंग पॉइंट समस्याओं को पूरी तरह से टालने के लिए।

दूसरा पूर्णांक भाग घटाना है, फिर इसे 10 से गुणा करें और फिर शून्य होने तक पूर्णांक भाग घटाएं। यह फ़्लोटिंग पॉइंट नंबरों के कम्प्यूटर प्रस्तुति की सीमाओं से सीमित है - प्रत्येक चरण में आपको उस संख्या की समस्या मिल सकती है जिसे बिल्कुल प्रदर्शित नहीं किया जा सकता है (इसलिए .2155 वास्तव में .21549 99 99 998 हो सकता है)।

count = 0 
num = abs(num) 
num = num - int(num) 
while num != 0: 
    num = num * 10 
    count = count + 1 
    num = num - int(num) 

आप संख्या की तरह आप मिल जाएगा पता है (उदाहरण के लिए, वे सब हो जाएगा: की तरह निम्नलिखित (अपरीक्षित, मेरे सिर है, जो एक COMx-35 के साथ बराबर के बारे में है को छोड़कर) कुछ दशमलव बिंदु के बाद 0 से 4 अंक), आप इसे ठीक से करने के लिए मानक फ़्लोटिंग पॉइंट "चाल" का उपयोग कर सकते हैं। उदाहरण के लिए, के बजाय के लिए:?

while num != 0: 

उपयोग

while abs(num) >= 0.0000001: 
+1

.2155 बनने वाला नहीं है .21559 99 99 99 999, लेकिन .2156 –

+1

कोई भी स्मार्ट-एलेक पसंद नहीं कर सकता :-) धन्यवाद, @quant_dev, मैंने इसे ठीक किया। – paxdiablo

+2

मैं केवल चालाक के रूप में वर्गीकृत करता हूं क्योंकि आपने इस सवाल का कितना अच्छा जवाब दिया है। – ojblass

4
मेरे सिर के ऊपर बंद

: आंशिक भाग के साथ

शुरू: .2155

बार-बार

10 से गुणा और संख्या का पूर्णांक भाग फेंक जब तक आप शून्य मिलता है। चरणों की संख्या दशमलव की संख्या होगी। उदाहरण के लिए:

.2155 * 10 = 2.155 
.155 * 10 = 1.55 
.55 * 10 = 5.5 
.5 * 10 = 5.0 

4 चरणों = 4 दशमलव अंक

+0

यह आपको वास्तव में आसानी से गोल त्रुटियों देता है। कोशिश करो। – Bim

2

आपका क्या मतलब है "स्वतंत्र रूप से संग्रहीत (पूर्णांक" एक बार एक पूर्णांक में जमा हो जाती है, यह शून्य दशमलव, छोड़ दिया स्पष्ट रूप से है एक डबल संग्रहित है। एक बाइनरी रूप में, इसलिए "decimals" के लिए कोई स्पष्ट या सरल संबंध नहीं है। आप इनपुट को स्ट्रिंग के रूप में क्यों नहीं रखते हैं, केवल उन दशमलवों को गिनने के लिए पर्याप्त है, इसे अपने अंतिम संख्यात्मक-चरणीय गंतव्य पर भेजने से पहले?

2

ऐसा कुछ भी काम कर सकता है:

float i = 5.2154; 
std::string s; 
std::string t; 
std::stringstream out; 
out << i; 
s = out.str(); 

t = s.substr(s.find(".")+1); 
cout<<"number of decimal places: " << t.length(); 
+0

आपको किसी भी तरह की संख्याओं के लिए खाते की आवश्यकता होगी जो एक फ्लोट में अच्छी तरह से फिट न हों, यानी यदि आप 5.21539 99 99 99 99 99 के साथ समाप्त होते हैं, तो आप शायद 4 दशमलव स्थानों की रिपोर्ट करना चाहते हैं। –

6

एक बार उपयोगकर्ता प्रतिनिधित्व (स्ट्रिंग, ओसीआर-एड gif फ़ाइल, जो कुछ भी) एक फ्लोटिंग पॉइंट नंबर में परिवर्तित हो जाता है, तो आप आवश्यक संख्या से निपट नहीं रहे हैं। तो सख्त, बहुत उपयोगी उत्तर "नहीं" है।

हैं (मामले एक) आप स्ट्रिंग प्रतिनिधित्व से नंबर परिवर्तित करने से बच सकते हैं, समस्या बहुत आसान हो जाता है, आप केवल दशमलव बिंदु के बाद अंक गिनती और अनुगामी शून्य की संख्या घटाने के लिए की जरूरत है।

आप इसे (मामले बी) ऐसा नहीं कर सकते हैं, तो आप, दशमलव की अधिकतम संख्या के बारे में एक धारणा बना स्ट्रिंग प्रतिनिधित्व में वापस और दौर यह इस अधिकतम संख्या को कनवर्ट कर round-to-even method का उपयोग कर की जरूरत है। उदाहरण के लिए, यदि उपयोगकर्ता 1.1 की आपूर्ति करता है जो 1.0 99 99 99 99 99 999 (hypothetically) के रूप में प्रतिनिधित्व करता है, इसे वापस स्ट्रिंग उपज में परिवर्तित कर रहा है, अनुमान लगाएं, "1.0 99 99 99 99 99 999"। इस नंबर को गोल करने के लिए, कहें, चार दशमलव बिंदु आपको "1.1000" देते हैं। अब यह केस ए पर वापस आ गया है।

0

मैं मूल्य को स्ट्रिंग के रूप में पढ़ने, दशमलव बिंदु की खोज करने और पूर्णांक के रूप में पहले और उसके बाद पाठ को पार्स करने का सुझाव दूंगा। कोई फ़्लोटिंग पॉइंट या राउंडिंग त्रुटियां नहीं।

-1

एक तरीका स्ट्रिंग के रूप में संख्या को पढ़ने के लिए होगा। दशमलव बिंदु के बाद सबस्ट्रिंग की लंबाई पाएं और यह कितना दशमलव दर्ज किया गया है। एक नाव में

का उपयोग कर एक अलग टिप्पणी पर द्वारा इस स्ट्रिंग परिवर्तित करने के लिए; फ्लोटिंग पॉइंट ऑपरेशंस से निपटने के लिए यह एक अच्छा विचार है जब उन्हें एक विशेष वस्तु में सीमित किया जाता है जिसमें परिशुद्धता होती है। उदाहरण के लिए, आप फ्लोट पॉइंट को "दशमलव" नामक विशेष प्रकार की ऑब्जेक्ट में स्टोर कर सकते हैं, जहां पूरे नंबर भाग और संख्या का दशमलव भाग दोनों चींटियां हैं। इस तरह आप एक सीमित परिशुद्धता है। इसका नकारात्मक पक्ष यह है कि आपको अंकगणितीय परिचालन (+, -, *, /, आदि) के तरीकों को लिखना है, लेकिन आप सी ++ में ऑपरेटरों को आसानी से ओवरराइट कर सकते हैं। मुझे पता है कि यह आपके मूल प्रश्न से विचलित है, लेकिन अपने दशमलव को एक सीमित रूप में स्टोर करना हमेशा बेहतर होता है। इस तरह आप अपने प्रश्न का उत्तर भी दे सकते हैं कि संख्या में कितने दशमलव हैं।

+0

यदि आप किसी भी चीज की गणना करने की आवश्यकता है तो यह (लगभग) कभी अच्छा नहीं होता है। –

1

वैज्ञानिक संकेतन प्रारूप का उपयोग कर (राउंडिंग त्रुटियों से बचने के):

#include <stdio.h> 
#include <string.h> 

/* Counting the number of decimals 
* 
* 1. Use Scientific Notation format 
* 2. Convert it to a string 
* 3. Tokenize it on the exp sign, discard the base part 
* 4. convert the second token back to number 
*/ 

int main(){ 

    int counts; 
    char *sign; 
    char str[15]; 
    char *base; 
    char *exp10; 
    float real = 0.00001; 

    sprintf (str, "%E", real); 
    sign= (strpbrk (str, "+"))? "+" : "-"; 

    base = strtok (str, sign); 
    exp10 = strtok (NULL, sign); 

    counts=atoi(exp10); 

    printf("[%d]\n", counts); 

    return 0; 
} 

[5]

1

साल लड़ाई के बाद लेकिन जैसा कि मैंने तीन लाइनों में अपने ही समाधान कर दिया है:

string number = "543.014";  
size_t dotFound; 
stoi(number, &dotFound)); 
string(number).substr(dotFound).size() 

बेशक आपको पहले परीक्षण करना होगा यदि यह वास्तव में एक फ्लोट है (उदाहरण के लिए stof(number) == stoi(number) के साथ)

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