سؤال

ممكن مكررة:
لماذا الحواد النقطة العائمة في C # غير دقيقة؟

لقد كنت أتعامل مع بعض الأرقام و C #، وينتج سطر التعليمات البرمجية التالي برقم مختلف عن المرء:

double num = (3600.2 - 3600.0);

كنت أتوقع أن تكون الأسطوانات 0.2، لكنها تحولت إلى 0.199999999998181. هل هناك أي سبب يجعله ينتج عنه قريبا، لكنه لا يزال مختلفا عشري؟

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

المحلول

هذا بسبب double هو نقطة بيانات نقطة عائمة.

إذا كنت تريد دقة أكبر يمكنك التبديل إلى استخدام decimal في حين أن.

لاحقة حرفية ل decimal هو م، لذلك لاستخدام decimal حسابي (وإنتاج أ decimal النتيجة) يمكنك كتابة التعليمات البرمجية الخاصة بك

var num = (3600.2m - 3600.0m);

لاحظ أن هناك عيوب لاستخدام أ decimal. وبعد إنه نوع بيانات 128 بت بدلا من 64 بت وهو حجم double. وبعد هذا يجعلها أكثر تكلفة من حيث الذاكرة والمعالجة. كما أن لديها مجموعة أصغر بكثير من double.

نصائح أخرى

يوجد سبب.

السبب هو أن الطريقة التي يتم بها تخزين الرقم في الذاكرة، في حالة نوع البيانات المزدوج، لا يسمح بتمثيل دقيق للرقم 3600.2. كما أنه لا يسمح بتمثيل دقيق للعدد 0.2.

0.2 لديه تمثيل لانهائي في ثنائي. إذا كنت ترغب في تخزينها في سجلات الذاكرة أو المعالج، لأداء بعض العمليات الحسابات، يتم تخزين بعض الأرقام المقربة من 0.2 مع تمثيل محدود بدلا من ذلك. قد لا يكون واضحا إذا قمت بتشغيل التعليمات البرمجية مثل هذا.

double num = (0.2 - 0.0);

هذا لأنه في هذه الحالة، يتم استخدام جميع الأرقام الثنائية المتاحة لتمثيل الأرقام في نوع البيانات المزدوج لتمثيل الجزء الكسري من الرقم (لا يوجد سوى الجزء الكريكي) والدقة أعلى. إذا قمت بتخزين الرقم 3600.2 في كائن من النوع المزدوج، يتم استخدام بعض الأرقام لتمثيل الجزء الصحيح - 3600 وهناك أرقام أقل يمثل الجزء الكسري. الدقة هو الجزء السفلي والكسرية في الواقع مخزنة في الذاكرة يختلف من 0.2 بما فيه الكفاية، يصبح الأمر واضحا بعد التحويل من مزدوج إلى سلسلة

تغيير نوعك إلى decimal:

decimal num = (3600.2m - 3600.0m);

يجب أن تقرأ أيضا هذه.

يرى ويكيبيديا

لا يمكن أن يفسر ذلك بشكل أفضل. يمكنني أيضا اقتراح القراءة ما يجب أن يعرفه كل عالم الكمبيوتر عن الحساب العائم. وبعد أو انظر الأسئلة ذات الصلة stackoverflow..

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