سؤال

لقد كنت أضرب رأسي على هذا واحد كل يوم.C++ المشروع أنا أعمل حاليا على شرط لعرض للتحرير القيمة.المحدد حاليا أرقام يعرض زيادة القيمة أعلاه decremented قيمة أدناه للحصول قال أرقام.فمن المفيد أن تكون قادرا على الرجوع للتحرير قيمة كل عدد مجموعة من الأرقام.ماذا سيكون رائع إذا كان هناك بعض فهرسة شكل النقطة العائمة العدد ، ولكن كنت غير قادر على العثور على مثل هذا الحل.أنا رمي هذا السؤال هناك لمعرفة ما إذا كان هناك شيء واضح أنا في عداد المفقودين أو إذا كان ينبغي لي أن مجرد لفة بلدي.


شكرا على النصيحة!كنت اتمنى الحل الذي لن التحويل من تعويم -> سلسلة -> int, ولكن أنا أعتقد وهذا هو أفضل طريقة للحصول على بعيدا عن النقطة العائمة تكميم القضايا.لقد ذهبت مع دفعة::تنسيق و الرجوع الفرد شخصيات السلسلة.أنا لا يمكن أن نرى أن تكون ضخمة الفارق في الأداء مقارنة باستخدام مجموعات من modf و fmod محاولة الحصول على أرقام من تعويم (ربما يفعل ذلك فقط من وراء الكواليس فقط بقوة أكثر من التنفيذ).

هل كانت مفيدة؟

المحلول

وكان التمثيل الداخلي للأرقام النقطة تعويم ليست مثل تراه. يمكنك يلقي فقط لstirng.

لالزهر، وقيام بذلك:

char string[99];
sprintf(string,"%f",floatValue);

وأو الاطلاع على: HTTP: // www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.1

وهذه المادة ويكيبيديا يمكن أن تفسر أكثر على تمثيل: http://en.wikipedia.org/wiki/ Floating_point

نصائح أخرى

هناك العديد من الطرق لتحويل سلسلة. (على الرغم من أنني لا يفضلون snprintf() نفسي.)

أو يمكنك تحويل إلى int و سحب الأرقام مع معامل صحيح شعبة.يمكنك الاعتماد على عدد من الأرقام مع السجل{base10}.

(تذكر:سجل{baseA}_X / log{baseA}_B = log{baseB}_X.)

على سبيل المثال:

#define SHOW(X) cout << # X " = " << (X) << endl

int
main()
{
  double d = 1234.567;

  SHOW( (int(d)%10000) / 1000 );
  SHOW( (int(d)%1000)  / 100  );
  SHOW( (int(d)%100)   / 10   );
  SHOW( (int(d)%10)           );
  SHOW( (int(d*10)  % 10)     );
  SHOW( (int(d*100) % 10)     );
  SHOW( (int(d*1000)% 10)     );

  SHOW( log(d)/log(10) );
}

على الرغم من أنك يجب أن تستخدم static_cast...

احترس من والأسية.مع مجموعة كبيرة جدا أو صغيرة جدا أرقام, قد يكون لديك مشكلة.

أرقام النقطة العائمة أيضا جولة قبالة القضايا التي قد تسبب لك بعض الحزن.(هو نفس السبب لماذا نحن لا نستخدم المشغل== بين اثنين الزوجي.أو لماذا لا يمكنك أن تعتمد على a*b == b*a.اعتمادا على نفس قيم a & b, قد تختلف قليلا جدا حول 10^-25.)

ويمكنك التحويل بين سلسلة وتطفو فقط باستخدام دفعة :: lexical_cast. ومع ذلك، لا يمكنك مباشرة مؤشر شكل تعويم - انها داخليا لا المخزنة على أرقام عشرية. وربما هذا هو ليس كثيرا من قضية. واجهة المستخدم الخاص بك، فإنك على الأرجح الحفاظ على شكل سلسلة من العدد على أي حال، مع التحويلات من والى تعويم في جالبة / اضع.

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