প্রিন্টফে () এর শিওরগুলি এড়িয়ে চলুন


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 অক্ষর রাখতে স্ট্রিংটি ম্যানিপুলেট করুন।

আপনার সংখ্যাটি ভেরিয়েবল নাম্বারে রয়েছে তা ধরে নিলে, নিম্নলিখিত ফাংশনটি প্রথম 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, '।') হওয়া উচিত; বিশ্বব্যাপী পরিবর্তে ফাংশন পরম ব্যবহার করতে To
n3wtz

অনেকগুলি সংখ্যা ব্যবহার করা অপ্রত্যাশিত ফলাফলগুলিকে ট্রিগার করতে পারে ... উদাহরণস্বরূপ 0.1% সহ "% .20g" আবর্জনা প্রদর্শন করবে। আপনি যদি ব্যবহারকারীদের অবাক করতে না চান তবে আপনাকে যা করতে হবে তা হ'ল 15 ডিজিট থেকে শুরু করুন এবং atofএকই মানটি ফেরত না দেওয়া পর্যন্ত ইনক্রিমেন্টিং চালিয়ে যান।
6502

@ 6502, সেখানে IEEE754 0.1 যেমন জিনিস কারণ যে :-) যাইহোক, এটা হবে একটি সমস্যা কারণ নেই (যে মান জন্য অন্তত) যেহেতু পরিসমাপ্তি 0.10000000000000000555হবে 0.1যখন ফিরে ছিনতাই। সমস্যাটি যদি আসতে পারে তবে যদি আপনার নিকটতম উপস্থাপনা 42.1ছিল যেমন এর অধীনে কিছুটা মান থাকে 42.099999999314159। আপনি যদি সত্যিই এটি পরিচালনা করতে চেয়েছিলেন, তবে আপনাকে সম্ভবত কাটা কাটার পরিবর্তে সরিয়ে নেওয়া শেষ সংখ্যাটির ভিত্তিতে গোল করতে হবে।
প্যাক্সডিয়াবলো

1
@ প্যাক্সিয়াব্লো: গতিযুক্তরূপে 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.335" মুদ্রিত হতে 1.3347 এবং 1.3397 মুদ্রিত হতে হবে "1.34" @xtofl: আমি ইতিমধ্যে এটি যাচাই করেছিলাম, তবে আমি এখনও আমার সমস্যার উত্তর দেখতে পাচ্ছি না
গর্পিক

3
লেখক স্টাইল চান 'এফ' স্টাইল নয় 'ই'। 'g' স্টাইল 'ই' ব্যবহার করতে পারে: ডকুমেন্টেশন থেকে: স্টাইল ই ব্যবহার করা হয় যদি এর রূপান্তর থেকে সূচকটি -4 এর চেয়ে কম বা নির্ভুলতার চেয়ে বড় বা সমান হয়।
জুলিয়েন পালার্ড

20

আমি আর এর উত্তরটি সামান্য টুইট করে পছন্দ করি:

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

'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
ব্যর্থ পরীক্ষার কেস: ফর্ম্যাটার "% .2 জি" সহ 1.012 এর ফলাফল 1.01 এর পরিবর্তে 1.012 হবে।
wtl

@ wtl চমৎকার ধরা। এখন স্থির।
জুহা

@ জিরোইন: আমি মনে করি যে সংখ্যাগুলি বড় হওয়ার সাথে সাথে কোনও এক সময় ভাসাগুলিও ব্যর্থ হয় ... তবে মূলত দীর্ঘ, দীর্ঘ দীর্ঘ বা ইন্টু 64৪ তে টাইপকেস্টিংয়ের কাজ করা উচিত।
জুহ

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 দশমিক दशক চাইলে "এলেস" যুক্ত বা সরিয়ে দিন; 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"সুনির্দিষ্টভাবে উল্লেখ করা: আপনার কাছ থেকে শূন্য trailing দেখতে হবে "%*.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;
}

মনে রাখবেন যে অঙ্কগুলি এবং দশমিক বিভাজকের জন্য ব্যবহৃত অক্ষরগুলি বর্তমান লোকেলের উপর নির্ভর করে। উপরের কোডটি একটি সি বা মার্কিন ইংরেজী লোকাল ধরেছে।


.000.00005 এবং 3 দশমিকের ফলে "−0" পাওয়া যাবে যা পছন্দসই বা নাও থাকতে পারে। এছাড়াও, অন্যের সুবিধার্থে "3" কে একটি প্যারামিটার বানাবেন?
ডলফিন

0

উত্তরে আমার প্রথম চেষ্টা এখানে:

অকার্যকর
এক্সপ্রিন্টফ্লোট (চর * ফর্ম্যাট, ফ্লোট এফ)
{
  চর এস [50];
  চর * পি;

  স্প্রিন্টফ (গুলি, ফর্ম্যাট, চ);
  (পি = এস; * পি; ++ পি) এর জন্য
    যদি ('।' == * পি)
      যখন (* ++, পি);
      যখন ('0' == * - পি) * পি = '\ 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"আপনি 32230210 এর মতো কিছু সংখ্যার জন্য পছন্দসই আউটপুট পাবেন না 32.23021এটি প্রিন্ট করা উচিত তবে এটি মুদ্রণ করে32.2302


-2

আপনার কোড এফ এর আগে ".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
প্রশ্নটি এমন একটি ফর্ম্যাট স্ট্রিং তৈরির বিষয়ে ছিল যা প্রতিটি ক্ষেত্রে পৃথক ফর্ম্যাট স্ট্রিং না রেখে ট্রেলিং শূন্যগুলি বাদ দেয়।
ক্রিস্টোফ ওয়েলসচ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.