لماذا فشل اختبار Xunit هذا؟
-
01-10-2019 - |
سؤال
Assert.Equal(1000000.0, table.Convert("g", "mcg", 1.0)); // Pass
Assert.Equal(2000000.0, table.Convert("g", "mcg", 2.0)); // Pass
Assert.Equal(3200000.0, table.Convert("g", "mcg", 3.2)); // Fail
// The failing one is equal to doing the following calculation, which fails also:
Assert.Equal(3200000.0, 3.2 * 1.0 / (1.0 / 1000000.0)); // Fail
Assert.Equal(3200000.0, 3.2 * (1.0 / (1.0 / 1000000.0)));// Pass, WTF?!?!
===================================================================
Assert.Equal() Failure
Expected: 3200000
Actual: 3200000
المحلول
مع ترتيب العمليات المختلفة ، يبدو أن أخطاء التقريب الثنائية النقطة العائمة تنتشر بشكل مختلف. يمكنك الحصول على نتائج "أقل إثارة للدهشة" ولكن من المحتمل أن تكون أبطأ مع النوع العشري.
3.2 * 1.0 / (1.0 / 1000000.0) -> 3200000.0000000005
(محاولة (3.2 * 1.0 / (1.0 / 1000000.0) ).ToString("R");
3.2 * (1.0 / (1.0 / 1000000.0)) -> 3200000.0
إذا لم تفهم بالفعل الاختلافات بين الأنواع العائمة والنقطة العشرية ، فيرجى قراءة: http://docs.sun.com/source/806-3568/ncg_goldberg.html
أو ، إذا كنت تفضل شيئًا باللغة الإنجليزية البسيطة:http://floating-point-gui.de/
نصائح أخرى
لا تستطيع Yoe رؤيتها من مقتطف الرمز الخاص بك ، لكنني متأكد تمامًا من أن لها علاقة بحقيقة أن خطوطك الأولى (الخطوط المارة) لها أ .0
, ، في حين أن الفشل لديه شيء غير متكافئ حتى الصفر بعد الفاصلة.
أنا متأكد من أن هناك شيئًا غريبًا مثل 3.2000000001
قادم في مكان ما. ربما من قاعدة البيانات؟
هول!
توماس