प्रिंटफ़ () में शून्य जाल से बचें


107

मैं प्रिंटफ़ () फ़ंक्शंस के परिवार के प्रारूप प्रारूप पर ठोकर खाता रहता हूं। मैं जो चाहता हूं, वह दशमलव बिंदु के बाद अंकों की अधिकतम दी गई संख्या के साथ एक डबल (या फ्लोट) प्रिंट करने में सक्षम है। अगर मैं उपयोग करता हूं:

printf("%1.3f", 359.01335);
printf("%1.3f", 359.00999);

मुझे मिला

359.013
359.010

की जगह वांछित

359.013
359.01

कोई भी मेरी मदद कर सकता हैं?


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

जवाबों:


88

यह सामान्य printfप्रारूप निर्दिष्टकर्ताओं के साथ नहीं किया जा सकता है । निकटतम तुम हो सकता है:

printf("%.6g", 359.013); // 359.013
printf("%.6g", 359.01);  // 359.01

लेकिन ".6" कुल संख्यात्मक चौड़ाई है

printf("%.6g", 3.01357); // 3.01357

इसे तोड़ता है।

आप एक स्ट्रिंग बफ़र की संख्या के लिए क्या कर सकते हैं sprintf("%.20g")तब स्ट्रिंग को हेरफेर केवल दशमलव बिंदु से पहले एन अक्षर होते हैं।

मान लें कि आपका नंबर परिवर्तनशील संख्या में है, तो निम्न फ़ंक्शन सभी लेकिन पहले Nदशमलव को हटा देगा , फिर अनुगामी शून्य (और दशमलव बिंदु यदि वे सभी शून्य हैं) को हटा दें ।

char str[50];
sprintf (str,"%.20g",num);  // Make the number.
morphNumericString (str, 3);
:    :
void morphNumericString (char *s, int n) {
    char *p;
    int count;

    p = strchr (s,'.');         // Find decimal point, if any.
    if (p != NULL) {
        count = n;              // Adjust for more or less decimals.
        while (count >= 0) {    // Maximum decimals allowed.
             count--;
             if (*p == '\0')    // If there's less than desired.
                 break;
             p++;               // Next character.
        }

        *p-- = '\0';            // Truncate string.
        while (*p == '0')       // Remove trailing zeros.
            *p-- = '\0';

        if (*p == '.') {        // If all decimals were zeros, remove ".".
            *p = '\0';
        }
    }
}

आप काट-छांट पहलू (जो चालू करेंगे के साथ खुश नहीं हैं 0.12399में 0.123करने के लिए यह गोलाई के बजाय 0.124), आप वास्तव में पहले से ही द्वारा प्रदान की गोलाई सुविधाओं का उपयोग कर सकते printf। आपको केवल गतिशील रूप से चौड़ाई बनाने के लिए पहले हाथ की संख्या का विश्लेषण करने की आवश्यकता है, फिर संख्या को स्ट्रिंग में बदलने के लिए उन का उपयोग करें:

#include <stdio.h>

void nDecimals (char *s, double d, int n) {
    int sz; double d2;

    // Allow for negative.

    d2 = (d >= 0) ? d : -d;
    sz = (d >= 0) ? 0 : 1;

    // Add one for each whole digit (0.xx special case).

    if (d2 < 1) sz++;
    while (d2 >= 1) { d2 /= 10.0; sz++; }

    // Adjust for decimal point and fractionals.

    sz += 1 + n;

    // Create format string then use it.

    sprintf (s, "%*.*f", sz, n, d);
}

int main (void) {
    char str[50];
    double num[] = { 40, 359.01335, -359.00999,
        359.01, 3.01357, 0.111111111, 1.1223344 };
    for (int i = 0; i < sizeof(num)/sizeof(*num); i++) {
        nDecimals (str, num[i], 3);
        printf ("%30.20f -> %s\n", num[i], str);
    }
    return 0;
}

nDecimals()इस मामले में संपूर्ण बिंदु फ़ील्ड की चौड़ाई को सही ढंग से काम करना है, फिर उस पर आधारित एक प्रारूप स्ट्रिंग का उपयोग करके संख्या को प्रारूपित करें। परीक्षण हार्नेस main()यह कार्रवाई में दिखाता है:

  40.00000000000000000000 -> 40.000
 359.01335000000000263753 -> 359.013
-359.00999000000001615263 -> -359.010
 359.00999999999999090505 -> 359.010
   3.01357000000000008200 -> 3.014
   0.11111111099999999852 -> 0.111
   1.12233439999999995429 -> 1.122

एक बार जब आपके पास सही ढंग से गोल मूल्य होता है, तो आप एक बार फिर से पास कर सकते हैं ताकि morphNumericString()बस बदलकर ट्रेलिंग जीरो को हटाया जा सके:

nDecimals (str, num[i], 3);

में:

nDecimals (str, num[i], 3);
morphNumericString (str, 3);

(या कॉल morphNumericStringके अंत में nDecimals, लेकिन उस स्थिति में, मैं शायद दोनों को एक फ़ंक्शन में मिला दूंगा), और आप इसे समाप्त करते हैं:

  40.00000000000000000000 -> 40
 359.01335000000000263753 -> 359.013
-359.00999000000001615263 -> -359.01
 359.00999999999999090505 -> 359.01
   3.01357000000000008200 -> 3.014
   0.11111111099999999852 -> 0.111
   1.12233439999999995429 -> 1.122

8
ध्यान दें, यह उत्तर मानता है कि दशमलव स्थान .कुछ स्थानों पर है, दशमलव स्थान वास्तव में एक ,अल्पविराम है।

1
यहाँ वास्तव में एक छोटा टाइपो है - p = strchr (str, '।'); वास्तव में p = strchr (s, '।') होना चाहिए; वैश्विक संस्करण के बजाय फ़ंक्शन परम का उपयोग करने के लिए।
n3wtz

बहुत से अंकों का उपयोग करने से अप्रत्याशित परिणाम प्राप्त हो सकते हैं ... उदाहरण के लिए "% .20g" 0.1 के साथ कचरा प्रदर्शित करेगा। यदि आप उपयोगकर्ताओं को आश्चर्यचकित नहीं करना चाहते हैं, तो आपको 15 अंकों से शुरू करने की आवश्यकता है और जब तक atofसमान मूल्य वापस नहीं मिलता तब तक वेतन वृद्धि जारी रखें ।
6502

@ 6502, वहाँ IEEE754 में 0.1 जैसी कोई चीज नहीं है, क्योंकि है कि का आनंद लें :-) हालांकि, यह होगा एक समस्या कारण नहीं (कि मूल्य के लिए कम से कम) के बाद से उसके एवज में 0.10000000000000000555हो जाएगा 0.1जब वापस छीन लिया। समस्या तब आ सकती है जब आपके पास थोड़ा मूल्य हो जैसे कि निकटतम प्रतिनिधित्व 42.1था 42.099999999314159। यदि आप वास्तव में इसे संभालना चाहते हैं, तो संभवतः आपको ट्रंकट के बजाय हटाए गए अंतिम अंक के आधार पर गोल करना होगा।
पैक्सिडाब्लो

1
@paxdiablo: printfजैसा कि वे पहले से ही डायनामिक पैरामीटर ( *विशेष वर्ण) का समर्थन करते हैं , जैसे कि वे पहले से ही डायनामिक printf("%*.*f", total, decimals, x);रूप से निर्दिष्ट कुल फ़ील्ड लंबाई और दशमलव के साथ एक संख्या को आउटपुट करते हैं, गतिशील रूप से फ़ंक्शनल स्ट्रिंग बनाने की कोई आवश्यकता नहीं है ।
6502

54

अनुगामी शून्य से छुटकारा पाने के लिए, आपको "% g" प्रारूप का उपयोग करना चाहिए:

float num = 1.33;
printf("%g", num); //output: 1.33

इस सवाल को थोड़ा स्पष्ट करने के बाद, कि शून्य को दबाया जाना केवल एक चीज नहीं है, बल्कि आउटपुट को तीन दशमलव स्थानों तक सीमित करना भी आवश्यक था। मुझे लगता है कि स्प्रिंटफ प्रारूप स्ट्रिंग्स के साथ अकेले नहीं किया जा सकता है। जैसा कि पैक्स डियाब्लो ने बताया, स्ट्रिंग हेरफेर की आवश्यकता होगी।


MSDN सहायता पृष्ठ देखें: msdn.microsoft.com/en-us/library/0ecbz014(VS.80).aspx
xtofl

@ टोमलाक: यह वह नहीं करता जो मैं चाहता हूं। मैं दशमलव बिंदु के बाद अधिकतम अंकों को निर्दिष्ट करने में सक्षम होना चाहता हूं। यह है: मैं चाहता हूँ कि १.३३४ 1. "१.३३५" और १.३३ ९ "छपा होना चाहिए" १.३४ "@xtofl: मैंने पहले ही जाँच कर ली थी, लेकिन मैं अभी भी अपनी समस्या का उत्तर नहीं देख सकता
गोरक्षक

3
लेखक शैली 'च' नहीं 'शैली' चाहता है। 'g' शैली 'e' का उपयोग कर सकता है: प्रलेखन से: शैली e का उपयोग तब किया जाता है जब इसके रूपांतरण से प्रतिपादक -4 से कम या सटीक से अधिक या बराबर हो।
जूलियन पालार्ड

20

मुझे आर। का जवाब पसंद है।

float f = 1234.56789;
printf("%d.%.0f", f, 1000*(f-(int)f));

Precision 1000 ’शुद्धता का निर्धारण करता है।

0.5 राउंडिंग को पावर।

संपादित करें

ठीक है, इस जवाब को कुछ समय संपादित किया गया था और मैंने कुछ साल पहले जो मैं सोच रहा था उसे खो दिया था (और मूल रूप से यह सभी मानदंडों को पूरा नहीं करता था)। तो यहां एक नया संस्करण है (जो सभी मानदंडों को भरता है और नकारात्मक संख्याओं को सही ढंग से संभालता है):

double f = 1234.05678900;
char s[100]; 
int decimals = 10;

sprintf(s,"%.*g", decimals, ((int)(pow(10, decimals)*(fabs(f) - abs((int)f)) +0.5))/pow(10,decimals));
printf("10 decimals: %d%s\n", (int)f, s+1);

और परीक्षण के मामले:

#import <stdio.h>
#import <stdlib.h>
#import <math.h>

int main(void){

    double f = 1234.05678900;
    char s[100];
    int decimals;

    decimals = 10;
    sprintf(s,"%.*g", decimals, ((int)(pow(10, decimals)*(fabs(f) - abs((int)f)) +0.5))/pow(10,decimals));
    printf("10 decimals: %d%s\n", (int)f, s+1);

    decimals = 3;
    sprintf(s,"%.*g", decimals, ((int)(pow(10, decimals)*(fabs(f) - abs((int)f)) +0.5))/pow(10,decimals));
    printf(" 3 decimals: %d%s\n", (int)f, s+1);

    f = -f;
    decimals = 10;
    sprintf(s,"%.*g", decimals, ((int)(pow(10, decimals)*(fabs(f) - abs((int)f)) +0.5))/pow(10,decimals));
    printf(" negative 10: %d%s\n", (int)f, s+1);

    decimals = 3;
    sprintf(s,"%.*g", decimals, ((int)(pow(10, decimals)*(fabs(f) - abs((int)f)) +0.5))/pow(10,decimals));
    printf(" negative  3: %d%s\n", (int)f, s+1);

    decimals = 2;
    f = 1.012;
    sprintf(s,"%.*g", decimals, ((int)(pow(10, decimals)*(fabs(f) - abs((int)f)) +0.5))/pow(10,decimals));
    printf(" additional : %d%s\n", (int)f, s+1);

    return 0;
}

और परीक्षण के उत्पादन:

 10 decimals: 1234.056789
  3 decimals: 1234.057
 negative 10: -1234.056789
 negative  3: -1234.057
 additional : 1.01

अब, सभी मानदंडों को पूरा किया जाता है:

  • शून्य के पीछे दशमलव की अधिकतम संख्या निर्धारित है
  • ट्रेलिंग शून्य हटा दिए जाते हैं
  • क्या यह गणितीय रूप से सही है (सही?)
  • पहला दशमलव शून्य होने पर भी (अब) काम करता है

दुर्भाग्य से यह उत्तर दो-लाइनर है क्योंकि sprintfस्ट्रिंग वापस नहीं आती है।


1
यह वास्तव में अनुगामी शून्य को ट्रिम करने के लिए प्रतीत नहीं होता है, हालांकि? यह ख़ुशी से 1.1000 की तरह कुछ बाहर थूक सकता है।
डीन जे।

सवाल और मेरा जवाब अब मूल नहीं हैं ... मैं बाद में जांच करूंगा।
जूहा

1
असफल परीक्षण के मामले: 1.012 फॉर्मेटर "% .2g" के साथ 1.01 के बजाय 1.012 में परिणाम होगा।
wtl

@wtl अच्छा कैच। अब तय हो गया।
जूहा

@ जरीन: मुझे लगता है कि जब संख्या बड़ी हो जाती है, तो कुछ बिंदु पर भी फ़्लोट्स विफल हो जाते हैं ... लेकिन मूल रूप से लंबे, लंबे या int64 टाइपकास्टिंग काम करना चाहिए।
जूहा

2

मैं पहले अक्षर के 1लिए 9(ASCII मान 49- 57) में पहले वर्ण के लिए स्ट्रिंग (सबसे दाईं ओर शुरू) खोजता हूं ( फिर nullसे 0) इसके प्रत्येक अधिकार पर - नीचे देखें:

void stripTrailingZeros(void) { 
    //This finds the index of the rightmost ASCII char[1-9] in array
    //All elements to the left of this are nulled (=0)
    int i = 20;
    unsigned char char1 = 0; //initialised to ensure entry to condition below

    while ((char1 > 57) || (char1 < 49)) {
        i--;
        char1 = sprintfBuffer[i];
    }

    //null chars left of i
    for (int j = i; j < 20; j++) {
        sprintfBuffer[i] = 0;
    }
}

2

इस तरह की चीज़ के बारे में क्या हो सकता है (इसमें राउंडिंग एरर और नकारात्मक-मूल्य के मुद्दे हो सकते हैं, जिसमें डीबगिंग की जरूरत है, पाठक के लिए एक अभ्यास के रूप में छोड़ दिया गया है):

printf("%.0d%.4g\n", (int)f/10, f-((int)f-(int)f%10));

यह थोड़ा प्रोग्रामेटिक है लेकिन कम से कम यह आपको कोई स्ट्रिंग हेरफेर नहीं करता है।


1

एक सरल समाधान लेकिन यह काम पूरा हो जाता है, एक ज्ञात लंबाई और सटीकता प्रदान करता है और घातीय प्रारूप (जो कि जब आप% g का उपयोग करते हैं तो जोखिम है) जाने की संभावना से बचता है:

// Since we are only interested in 3 decimal places, this function
// can avoid any potential miniscule floating point differences
// which can return false when using "=="
int DoubleEquals(double i, double j)
{
    return (fabs(i - j) < 0.000001);
}

void PrintMaxThreeDecimal(double d)
{
    if (DoubleEquals(d, floor(d)))
        printf("%.0f", d);
    else if (DoubleEquals(d * 10, floor(d * 10)))
        printf("%.1f", d);
    else if (DoubleEquals(d * 100, floor(d* 100)))
        printf("%.2f", d);
    else
        printf("%.3f", d);
}

यदि आप अधिकतम 2 दशमलव चाहते हैं, तो "elses" जोड़ें या निकालें; 4 दशमलव; आदि।

उदाहरण के लिए यदि आप 2 दशमलव चाहते थे:

void PrintMaxTwoDecimal(double d)
{
    if (DoubleEquals(d, floor(d)))
        printf("%.0f", d);
    else if (DoubleEquals(d * 10, floor(d * 10)))
        printf("%.1f", d);
    else
        printf("%.2f", d);
}

यदि आप फ़ील्ड को संरेखित रखने के लिए न्यूनतम चौड़ाई निर्दिष्ट करना चाहते हैं, तो उदाहरण के लिए आवश्यक वेतन वृद्धि:

void PrintAlignedMaxThreeDecimal(double d)
{
    if (DoubleEquals(d, floor(d)))
        printf("%7.0f", d);
    else if (DoubleEquals(d * 10, floor(d * 10)))
        printf("%9.1f", d);
    else if (DoubleEquals(d * 100, floor(d* 100)))
        printf("%10.2f", d);
    else
        printf("%11.3f", d);
}

आप इसे उस फ़ंक्शन में भी बदल सकते हैं, जहाँ आप फ़ील्ड की वांछित चौड़ाई पास करते हैं:

void PrintAlignedWidthMaxThreeDecimal(int w, double d)
{
    if (DoubleEquals(d, floor(d)))
        printf("%*.0f", w-4, d);
    else if (DoubleEquals(d * 10, floor(d * 10)))
        printf("%*.1f", w-2, d);
    else if (DoubleEquals(d * 100, floor(d* 100)))
        printf("%*.2f", w-1, d);
    else
        printf("%*.3f", w, d);
}

ले लो d = 0.0001: तो floor(d)है 0, तो अंतर 0.000001 से भी बड़ा है, इसलिए DoubleEqualsगलत है, तो यह होगा नहीं का उपयोग "%.0f"विनिर्देशक: आप से शून्य अनुगामी देखेंगे "%*.2f"या "%*.3f"। तो यह सवाल का जवाब नहीं है।
कूर

1

मुझे पोस्ट किए गए कुछ समाधानों में समस्याएं मिलीं। मैंने इसे उत्तर के आधार पर एक साथ रखा। ऐसा लगता है यह मेरे लिए काम का होगा।

int doubleEquals(double i, double j) {
    return (fabs(i - j) < 0.000001);
}

void printTruncatedDouble(double dd, int max_len) {
    char str[50];
    int match = 0;
    for ( int ii = 0; ii < max_len; ii++ ) {
        if (doubleEquals(dd * pow(10,ii), floor(dd * pow(10,ii)))) {
            sprintf (str,"%f", round(dd*pow(10,ii))/pow(10,ii));
            match = 1;
            break;
        }
    }
    if ( match != 1 ) {
        sprintf (str,"%f", round(dd*pow(10,max_len))/pow(10,max_len));
    }
    char *pp;
    int count;
    pp = strchr (str,'.');
    if (pp != NULL) {
        count = max_len;
        while (count >= 0) {
             count--;
             if (*pp == '\0')
                 break;
             pp++;
        }
        *pp-- = '\0';
        while (*pp == '0')
            *pp-- = '\0';
        if (*pp == '.') {
            *pp = '\0';
        }
    }
    printf ("%s\n", str);
}

int main(int argc, char **argv)
{
    printTruncatedDouble( -1.999, 2 ); // prints -2
    printTruncatedDouble( -1.006, 2 ); // prints -1.01
    printTruncatedDouble( -1.005, 2 ); // prints -1
    printf("\n");
    printTruncatedDouble( 1.005, 2 ); // prints 1 (should be 1.01?)
    printTruncatedDouble( 1.006, 2 ); // prints 1.01
    printTruncatedDouble( 1.999, 2 ); // prints 2
    printf("\n");
    printTruncatedDouble( -1.999, 3 ); // prints -1.999
    printTruncatedDouble( -1.001, 3 ); // prints -1.001
    printTruncatedDouble( -1.0005, 3 ); // prints -1.001 (shound be -1?)
    printTruncatedDouble( -1.0004, 3 ); // prints -1
    printf("\n");
    printTruncatedDouble( 1.0004, 3 ); // prints 1
    printTruncatedDouble( 1.0005, 3 ); // prints 1.001
    printTruncatedDouble( 1.001, 3 ); // prints 1.001
    printTruncatedDouble( 1.999, 3 ); // prints 1.999
    printf("\n");
    exit(0);
}

1

अत्यधिक मतदान के समाधानों में से कुछ %gरूपांतरण निर्दिष्ट करते हैं printf। यह गलत है क्योंकि ऐसे मामले हैं जहां %gवैज्ञानिक संकेतन पैदा करेंगे। अन्य समाधान दशमलव अंकों की वांछित संख्या को प्रिंट करने के लिए गणित का उपयोग करते हैं।

मुझे लगता है कि सबसे आसान समाधान रूपांतरण विनिर्देशक के sprintfसाथ उपयोग करना है %fऔर मैन्युअल रूप से ट्रेलिंग शून्य और संभवतः परिणाम से दशमलव बिंदु को हटाना है। यहाँ एक C99 समाधान है:

#include <stdio.h>
#include <stdlib.h>

char*
format_double(double d) {
    int size = snprintf(NULL, 0, "%.3f", d);
    char *str = malloc(size + 1);
    snprintf(str, size + 1, "%.3f", d);

    for (int i = size - 1, end = size; i >= 0; i--) {
        if (str[i] == '0') {
            if (end == i + 1) {
                end = i;
            }
        }
        else if (str[i] == '.') {
            if (end == i + 1) {
                end = i;
            }
            str[end] = '\0';
            break;
        }
    }

    return str;
}

ध्यान दें कि अंक और दशमलव विभाजक के लिए उपयोग किए जाने वाले वर्ण वर्तमान स्थान पर निर्भर करते हैं। उपरोक्त कोड एक C या US अंग्रेजी लोकेल मानता है।


−0.00005 और 3 दशमलव में "which0" का उत्पादन होगा जो वांछित हो सकता है या नहीं। इसके अलावा, हो सकता है कि "3" दूसरों की सुविधा के लिए एक पैरामीटर बनाएं?
डॉल्फिन

0

यहाँ एक उत्तर में मेरा पहला प्रयास है:

शून्य
xprintfloat (char * format, float f)
{
  चार एस [50];
  चार * पी;

  स्प्रिंटफ (एस, प्रारूप, एफ);
  के लिए (p = s; * p; ++ p)
    अगर ('। = = * p) {
      जबकि (* ++ पी);
      जबकि ('0' == * - p) * p = '\ 0';
    }
  प्रिंटफ ("% s", एस);
}

ज्ञात बग: प्रारूप के आधार पर संभावित बफर अतिप्रवाह। अगर "।" % f गलत परिणाम हो सकता है के अलावा अन्य कारण से मौजूद है।


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


0

ऊपर से थोड़ा बदलाव:

  1. मामले के लिए अवधि (10000.0) को समाप्त करता है।
  2. पहली अवधि के बाद ब्रेक्स को संसाधित किया जाता है।

यहाँ कोड:

void EliminateTrailingFloatZeros(char *iValue)
{
  char *p = 0;
  for(p=iValue; *p; ++p) {
    if('.' == *p) {
      while(*++p);
      while('0'==*--p) *p = '\0';
      if(*p == '.') *p = '\0';
      break;
    }
  }
}

यह अभी भी अतिप्रवाह के लिए संभावित है, इसलिए सावधान रहें; पी


0

मैं कहूंगा कि आपको इसका इस्तेमाल करना चाहिए printf("%.8g",value);

यदि आप उपयोग करते हैं "%.6g"तो आपको कुछ नंबरों के लिए वांछित आउटपुट नहीं मिलेगा जैसे कि.32.230210 इसे प्रिंट करना चाहिए 32.23021लेकिन यह प्रिंट करता है32.2302


-2

F से पहले ".3" के कारण आपका कोड तीन दशमलव स्थानों तक पहुंच जाता है

printf("%1.3f", 359.01335);
printf("%1.3f", 359.00999);

इस प्रकार यदि आप दूसरी पंक्ति में दो दशमलव स्थानों पर चक्कर लगाते हैं, तो आपको इसे इस पर बदलना चाहिए:

printf("%1.3f", 359.01335);
printf("%1.2f", 359.00999);

वह कोड आपके वांछित परिणामों को आउटपुट करेगा:

359.013
359.01

* ध्यान दें कि आप पहले से ही इसे अलग-अलग लाइनों पर प्रिंट कर रहे हैं, यदि ऐसा नहीं है तो निम्नलिखित इसे उसी लाइन पर प्रिंट करने से रोकेगा:

printf("%1.3f\n", 359.01335);
printf("%1.2f\n", 359.00999);

निम्नलिखित कार्यक्रम स्रोत कोड इस उत्तर के लिए मेरा परीक्षण था

#include <cstdio>

int main()
{

    printf("%1.3f\n", 359.01335);
    printf("%1.2f\n", 359.00999);

    while (true){}

    return 0;

}

4
सवाल एक प्रारूप स्ट्रिंग बनाने के बारे में था जो अनुगामी शून्य को छोड़ता है, प्रत्येक मामले के लिए अलग प्रारूप स्ट्रिंग नहीं है।
क्रिस्टोफ वेल्स ने
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.