यह सामान्य 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