سؤال

float totalAmount = 0;
.
.
.//totalAmount assigned value 1.05 correctly
.
totalAmount  += float.Parse(dataRow["Amt"].ToString()); //where dataRow["Amt"] has value 4.93

الجواب الذي أحصل عليه بالنسبة إلى TotalAmount هو 5.97999954 بدلا من 5.98

لماذا يحدث هذا؟

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

المحلول

أنت تنص على ذلك totalAmount هو 1.05، قبل التراكم. من شأنه أن يعطي النتائج المتوقعة:

1.05
4.93 +
------
5.98

يمكنك الحصول على 5.97999954، والتي هي في الأساس الإجابة كأفضل تمثيلها بواسطة النقطة العائمة IEEE، وهو تنسيق ثنائي لا يمكن التعبير عن كل رقم عشري. على سبيل المثال، المشترك بين 0.110 لديه تمثيل نقطة عائمة ثنائية لا حية .0001100110011...2.

وصلة ويكيبيديا، للقياس الجيد: http://en.wikipedia.org/wiki/floating_point#accuracy_problems. ;)

نصائح أخرى

هذا بسبب تمثيل قاعدة 10. الأرقام في أ قاعدة 2. النظام.

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

Jdmichal صحيحة، لكنني سأضيف ذلك، إذا كنت تريد بالفعل هذا لإضافته بشكل صحيح، فيمكنك استخدام النوع العشري (بما في ذلك الحرف العشري).

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