لماذا يعود uitextfield.text رقم تعويم دقيق عند استرداده من صفيف؟

StackOverflow https://stackoverflow.com/questions/19825257

سؤال

لدي صفيف يخزن إدخال textfield.text. ثم استرجع النص في مكان آخر باعتباره تعويمًا. يبدو أن هذا يعطيني "الرقم الدقيق" من حقل النص.

مثال

   navtestAppDelegate *appDelegate = 
   (navtestAppDelegate *)[[UIApplication 
    sharedApplication] delegate];

NSMutableArray *storedData = 
 appDelegate.myData;

[storedData replaceObjectAtIndex: myIndex withObject: mytextfield.text];

float number = [[storedData objectAtIndex:myIndex] floatValue];

إذا mytextfield.text input is 22.8, float number عائدات 22.8

ومع ذلك،

مثال ب

[storedData replaceObjectAtIndex: myIndex withObject: @"22.8”];

float number  = [[storedData objectAtIndex:myIndex] floatValue];

float number عائدات 22.7999999

لا أفهم لماذا أحصل على الرقم الدقيق في المثال أ

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

المحلول

لا يمكن تمثيل القيمة 22.8 في نقطة عائمة ثنائية بالضبط. ما تراه هو تمثيل يعتمد على تنسيق العرض. قد تستخدم طرق العرض المختلفة تنسيقات العرض المختلفة. إن عرض عدد مختلف من الأرقام والتقريب يعني أن كلا من 22.8 و 22.7999990 صحيحة لعدد الأرقام المعروضة بعد التقريب. لاحظ أنه تم عرض 22.7999999 وليس 22.8000000 لأن الرقم التالي كان 2 لذلك تم تقريب القيمة المعروضة.

هذا يعتمد على القاعدة ، وهذا هو الأشياء التي يمكن أن تكون دقيقة في قاعدة واحدة قد لا تكون قادرة على الدقة في قاعدة أرقام مختلفة. في هذه الحالة ، لا يمكن أن يكون 22.8 في قاعدة الأرقام العشرية دقيقة في قاعدة الأرقام الثنائية.

هذا هو السبب في وجود NSDecimal والسبب في عدم استخدام النقطة العائمة للقيم النقدية.

هذا يعادل إلى حد ما عرض قيمة PI في القاعدة العشرية ، وعدد الأرقام غير محدود ، لذلك لكل عرض قرر شخص ما عدد الأرقام التي يجب عرضها. ومن المثير للاهتمام ، يمكن تمثيل PI بالضبط (ولكن بشكل مفيد) في قاعدة أرقام PI. :-)

في حالة ما اذا float و double هناك عدد محدود من الأرقام التي يمكن تمثيلها.

نصائح أخرى

حاول مثل هذا:-

[storedData replaceObjectAtIndex: myIndex    
 withObject: [NSNumber 
 numberWithFloat:22.8]];
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top