سؤال

أول وظيفة هنا. وجود مشكلة في طريقة Floatvalue الخاصة بـ NSNumber - بطريقة ما ، فإنه يعيد رقمًا غير دقيق. إليكم المشكلة: أقوم بتخزين مجموعة من nsnumbers في صفيف ، مثل هذا:

NSArray *a = [NSArray arrayWithObjects:
    [NSNumber numberWithFloat:0.04f],
    [NSNumber numberWithFloat:0.028f], 
    [NSNumber numberWithFloat:0.016f],
    [NSNumber numberWithFloat:0.004f],
   nil];

ثم أحاول استرداد القيمة الأولى (على سبيل المثال): nsnumber ن = (nsnumber) [a objectAtIndex: 0] ؛ cgfloat f = [n floatvalue] ؛

في مصحح الأخطاء ، يظهر N قيمة 0.04 (في العمود الموجز) ، ولكن F يظهر قيمة 0.0399999991. ماذا أفعل خطأ هنا؟

شكرا لكم جميعا.

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

المحلول

أنت لا تفعل أي شيء خاطئ. هذه ليست مشكلة على وجه التحديد NSNumber أو CGFloat, ، أيضاً. إنه شيء عالمي للغاية عن أرقام النقطة العائمة ، والتي تستند إلى صلاحيات 2 ، وليس قوى Ten. يجب أن تقرأ هذه المقالة النهائية أو مقال ويكيبيديا.

النقطة المهمة هي أن أرقام النقاط العائمة القياسية يمكن أن تمثل فقط رقمًا يمثل مبلغًا 1/2 ، 1/4 ، 1/8 ، ... 1/10 ليس كذلك. لذلك لا يمكنك تمثيل 0.1 بدقة تمامًا باستخدام أرقام نقاط عائمة قياسية.

إذا كنت بحاجة حقًا إلى التعامل معها ، فهناك إجراءات تتعامل مع الكسور العقلانية أو أرقام النقاط العائمة العشرية.

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