سؤال

وكيف أقوم بإنشاء سلسلة بحيث تنسيقات أرقام النقطة العائمة لديهم أي نقطة أو الأرقام العشرية زائدة عندما يكون عدد صحيح، ولكن لعدم التبديل إلى العلمي لأعداد أكبر؟

وعندما أفعل:

float myFloat= 15.6f;
float myInt = 5.0f;
float myLarge = 7000000.0f;
sprintf(out, "my float is %g", myFloat);
sprintf(out, "my int is %g", myInt);
sprintf(out, "my large is %g", myLarge);

وأحصل على شيء من هذا القبيل:

my float is 15.6
my int is 5
my large is 7e+07f

وأريد كل سلسلة تنسيق واحدة من شأنها أن تعطي 15.6 و 5 و 700000.

السبب قام تعليقات لا تفعل التنسيق:

وهذا ما ظننت. ولكن المجمع هو مريح جدا كما لو هي جزء لا يتجزأ من سلاسل التنسيق في سلاسل التنسيق أطول:

sprintf(buf, "%d %g", myInt, myFloat);

وكيف التفاف ذلك؟

sprintf(buf, "%d %g", myInt, Wrapper(myFloat));??

وماذا يجب أن التفاف العودة؟ أو ما هو أسوأ:

sprintf(buf, "%d %s", myInt, Wrapper(myFloat));?? 
هل كانت مفيدة؟

المحلول

وأنا لا أعتقد أنه يمكنك الحصول على هذه مع %g، كما %g يعطيك أقصر من %e أو %f.

وهكذا، وأنا لا أعتقد أن هناك حجة printf واحدة ترضي لك. 15.6، يمكنك استخدام %2.1f. لل7000000، يمكنك استخدام %7.0f.

وأفضل رهان هو على الارجح لكتابة الدالة المجمع التي من شأنها أن ننظر إلى حجم القيمة الخاصة بك وتطبيق حجة printf الصحيحة.

نصائح أخرى

ويمكنك تنسيق مع "٪. * و"، والذي يسمح لك لتمرير الدقة كمعلمة منفصلة على سبيل المثال sprintf. لقد استعملت هذا في الماضي عندما كنت أرغب في عرض 0، 1، 2، أو ربما 3 أرقام لطيف دون اضافية زائدة 0 في. كتابة دالة المساعد القليل الذي يأخذ مزدوج / تعويم وإرجاع الدقة عدد صحيح (بضرب بحلول عام 1000 ومن ثم القيام مودولو 10، 100، 1000). ثم استدعاء sprintf مع "٪. * و" استدعاء الدالة المساعد، وتمرير تعويم.

ونهج مايك هو معقول، ولكن يمكنك حساب عدد الأرقام مباشرة باستخدام وظيفة LOG10، واستخدام إما الأرض أو سقف للتحقق من أنك في الواقع لديها قيمة عددية. شيء من هذا القبيل:

#include <math.h>
double x;
...
if (floor(x) == x && x != 0.0) { // x is an non-zero integer value
    int digits = floor(log10(fabs(x)+0.5)) + 1;
    printf("x is %.*f\n", digits, x);
}

وتفريغ تلك السلسلة من المكالمات وظيفة، علينا أولا أخذ القيمة المطلقة للتأكد من أن الحجة غير السلبية، إضافة 0.5 إلى قيمة عدد صحيح معروف لرعاية أي أخطاء roundoff الممكنة في مجال الحوسبة LOG10 من قوة على وجه الدقة من 10 ، والجمع بين LOG10 والأرضية للحصول على الأس من أكبر قوة 10 أقل من المصنوعة (خ) +0.5، وأخيرا إضافة 1 للحصول على عدد من الأرقام المطلوبة لتمثيل س. وفيما يلي بعض القيم العينة (من أوبن أوفيس، ولكن وظيفة C LOG10 يجب حساب في الدقة مماثلة):

         x          log10(x+0.5)
         1  0.176091259055681000
         9  0.977723605288848000
        10  1.021189299069940000
        99  1.997823080745730000
       100  2.002166061756510000
       999  2.999782798454140000
      1000  3.000217092972230000
     10000  4.000021714181250000
    100000  5.000002171466980000
   1000000  6.000000217147190000
  10000000  7.000000021714720000
 100000000  8.000000002171470000
1000000000  9.000000000217150000

واستبدال٪ ز مع٪ .10g لإظهار ما يصل إلى 10 أرقام كبيرة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top