2009-12-07 29 views
8

मेरे पास फ्लोट की एक सरणी है जहां डेटा अलग-अलग दशमलव बिंदुओं के साथ संग्रहीत किया जाता है, इसलिए कुछ 123.40000, 123.45000, 123.45600 ... अब अगर मैं इन मानों को 0s के बिना स्ट्रिंग में प्रिंट करना चाहता हूं printf() में अंत ताकि वे 123.4, 123.45, 123.456, अंत में उन 0 के बिना हैं। क्या यह संभव है? यदि हां, तो कैसे?printf में फ़्लोटिंग पॉइंट स्वरूपण()

उत्तर

18

% छ फ़ॉर्मेटर का उपयोग करें:

printf("%g", 123.4000); 

प्रिंट

123,4

पीछे चल शून्य निकाल दिए जाते हैं, लेकिन दुर्भाग्य से इतना अनुगामी दशमलव बिंदु है अगर आंशिक हिस्सा शून्य है। अगर वहाँ वास्तव में आपके द्वारा सीधे तौर printf() का उपयोग कर करना चाहते करने के लिए किसी भी तरह है मैं नहीं जानता कि - मुझे लगता है कि कुछ इस तरह शायद आपका सर्वश्रेष्ठ दांव है:% छ

#include <stdio.h> 
#include <math.h> 

void print(FILE * f, double d) { 
    if (d - floor(d) == 0.0) { 
     fprintf(f, "%g.", d); 
    } 
    else { 
     fprintf(f, "%g", d); 
    } 
} 

int main() { 
    print(stdout, 12.0); 
    print(stdout, 12.300); 
} 
+1

एक बुरा विचार युगल? तुलना करने के लिए है ना मिल "अगर (घ मंजिल (घ) == 0.0)" ? – himself

+1

@ खुद नहीं, यह ठीक है जब आप जानते हैं कि आप क्या कर रहे हैं। "कभी भी '=='' के लिए फ़्लोटिंग-पॉइंट नंबरों की तुलना न करें, अत्याधुनिक के लिए केवल अनुमान है। –

0

उपयोग -

प्रिंट सामान्य या घातीय नोटेशन में दोगुना, जो भी इसकी परिमाण के लिए अधिक उपयुक्त है। 'जी' लोअर केस अक्षरों का उपयोग करता है, 'जी' ऊपरी-केस अक्षरों का उपयोग करता है। इस प्रकार के दशमलव बिंदु के दाईं ओर उस महत्वहीन शून्य में निश्चित-बिंदु नोटेशन से थोड़ा अलग है। साथ ही, दशमलव बिंदु पूरी संख्या में शामिल नहीं है।

+0

बस एक छोटी सी क्वेरी, अगर मैं पिछली शून्य को हटाना चाहता हूं लेकिन दशमलव को पूरी संख्या में रखना चाहता हूं, जैसे 124.00000 123 है। – sfactor

3

मैं नहीं जानता कि यह कैसे hacky है, लेकिन:

http://codepad.org/e3Q3pUNd

float f = 124.000; 
if (f == (int) f) { 
    printf("%.1f\n", f); /* .1 can be changed */ 
} else { 
    printf("%g\n", f); 
} 

रिटर्न 124.0

float f = 124.123000; 
if (f == (int) f) { 
    printf("%.1f\n", f); /* .1 can be changed */ 
} else { 
    printf("%g\n", f); 
} 

124.123 देता है।

0

एक (बड़े पर्याप्त) बफर पर प्रिंट करें। बफर प्रिंट करें ... और यदि बफर में कोई '.' कोई डॉट प्रिंट नहीं है।

char buf[100]; 
sprintf(buf, "%g", val); 
printf("%s", buf); 
if (strchr(buf, '.') == NULL) putchar('.'); 

संपादित

स्टैंडर्ड को निर्दिष्ट # झंडा:

# परिणाम एक `` वैकल्पिक रूप 'में बदल जाती है। [...] ए, ए, ई, ई, एफ, एफ, जी, और जी रूपांतरण, फ्लोटिंग-पॉइंट संख्या को परिवर्तित करने का नतीजा हमेशा दशमलव-बिंदु वर्ण होता है, भले ही कोई अंक का पालन न करे । [...] जी और जी रूपांतरणों के लिए, परिणाम पीछे परिणाम से हटाया नहीं गया है। [...]

... लेकिन आप अनुगामी शून्य :(

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