سؤال

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 قادم في مكان ما. ربما من قاعدة البيانات؟

هول!
توماس

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