سؤال

أنا على الحصول على مشكلة غريبة أثناء تحليل قيمة مزدوجة في مدارة C++.قد يكون من أن أفعل شيئا خاطئا.عندما أفعل:

double value = 0.006;
result = Math::Parse( value)

إخراج النتيجة 0.006000000000001.السبب في ذلك هو إلحاق 1?

أيضا عندما تذهب جولة القيمة إلى 5 منازل عشرية ، فإنه فشل.أنا أفعل:

result2 = Math::Round(result, 5)

ولكن result2 دائما 0.006000000000001.ما الخطأ الذي فعلته ؟

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

المحلول

هذا طبيعي. تمثل هذه المشكلة الناجمة عن تنسيق IEEE المزدوج عند 0.006 الحقيقي على أنها تقريبية من الكسر الثنائي اللانهائي. لذلك لديك 3 طرق -

  • استخدام السلسلة المقابلة تشكل إلى الإخراج
  • استخدام النوع العشري
  • لا تستخدم == لمقارنة الأرقام، استخدم بدلا من ذلك <أو> مع خطأ ثابت، على سبيل المثال: (× -0.06) <خطأ

نصائح أخرى

ويرجع ذلك إلى الدقة.أعطى هذا الجواب هنا:

يطفو الزوجي عدد التمثيل مع بعض الدقة.ليس كل قيمة ممثلة في هذا الشكل.انظر هنا وكذلك.

يمكنك بسهولة التفكير لماذا هذا الحالة:هناك غير محدود عدد عدد فقط في intervall (1..1) ، ولكن تعويم محدودة عدد البتات تمثل جميع أرقام (-MAXFLOAT..MAXFLOAT).

أكثر بجدارة:في عدد صحيح 32 بت التمثيل هناك معدود عدد الأعداد الصحيحة أن تكون ممثلة ، ولكن هناك لانهائية لا تعد ولا تحصى عدد من القيم الحقيقية التي لا يمكن ممثلة تمثيلا كاملا في عدد محدود تمثيل 32 أو 64 بت.ولذلك هناك ليس فقط حد أعلى وأدنى قابل للتمثيل القيمة الحقيقية ، ولكن أيضا دقة.

فلماذا هو رقم القليل أرقام بعد النقطة العائمة تتأثر ؟ لأن التمثيل يستند إلى نظام ثنائي بدلا من عشري ، مما يجعل أرقام أخرى بسهولة يمثل ثم عشري منها.

الأرقام الدقيقة المزدوجة تقريبية بشكل أساسي، وغالبا ما يكون لديك ذيول لا يمكن التخلص من - أي ليست هناك طريقة للتعبير عن الرقم أكثر دقة.

قد تحصل على نتائج أكثر مثلك تتوقع إذا كنت تستخدم decimal - وهو ما لا يزال تقريبا، لكنه يستخدم قاعدة 10، لذلك يميل إلى التصرف أكثر مثل الناس يتوقعون. ولكن لأنه لا يتم تعيينه إلى نوع وحدة المعالجة المركزية، فإنه أبطأ.

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