এটি সাধারণ 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