nsnumber floatvalue لا يساوي قيمة nsnumber
سؤال
أول وظيفة هنا. وجود مشكلة في طريقة 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 بدقة تمامًا باستخدام أرقام نقاط عائمة قياسية.
إذا كنت بحاجة حقًا إلى التعامل معها ، فهناك إجراءات تتعامل مع الكسور العقلانية أو أرقام النقاط العائمة العشرية.