نتيجة غريبة عند طرح الزوجي [مكررة
سؤال
ممكن مكررة:
لماذا الحواد النقطة العائمة في 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 بما فيه الكفاية، يصبح الأمر واضحا بعد التحويل من مزدوج إلى سلسلة
يرى ويكيبيديا
لا يمكن أن يفسر ذلك بشكل أفضل. يمكنني أيضا اقتراح القراءة ما يجب أن يعرفه كل عالم الكمبيوتر عن الحساب العائم. وبعد أو انظر الأسئلة ذات الصلة stackoverflow..