سؤال

nstimeinterval == مزدوج؛ (على سبيل المثال 169.12345666663)

كيف يمكنني تقريب هذا المزدوج بحيث لا يوجد رقمين فقط بعد أن "النقطة"؟
سيكون من الجيد جدا إذا كانت النتيجة هي nsnumber.

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

المحلول

إذا كان هذا لأغراض العرض، نلقي نظرة على nsnumberformter..

إذا كنت ترغب حقا في جولة مزدوجة في العمليات الحسابية الخاصة بك لسبب ما، فيمكنك استخدام C القياسية C round() وظيفة.

نصائح أخرى

يمكن تقريب nsdecaly إلى عدد محدد من الأرقام مع nsdecimalround ().

double d = [[NSDate date] timeIntervalSince1970];
NSDecimal in = [[NSNumber numberWithDouble:d] decimalValue];
NSDecimal out;
NSDecimalRound( &out, &in, 2, NSRoundUp );

NSDecimalNumber *result = [NSDecimalNumber decimalNumberWithDecimal:out];

إذا كنت ترغب حقا في ترك رقمين بعد النقطة، مضاعفة بنسبة 100، فقم بإعادة تشغيلها باستخدام وظيفة Round ()، وقسمها بنسبة 100 مرة أخرى. ومع ذلك، لن يضمن هذا أنه يحتوي بالفعل على رقمين فقط بعد النقطة، نظرا لأنه من خلال تقسيمه مرة أخرى، قد تحصل على رقم لا يمكن التعبير عنه حقا بترميز النقطة العائمة وعندما تتوقع 0.1 قد تحصل على 0.09999 .. .، هذا لأنه لا يمكنك التعبير عن 0.1 حقا باستخدام تدوين النقاط العائمة.

إذا كنت ترغب فقط في تقليله إلى رقمين بعد نقطة DOT لأغراض العرض، فيمكنك استخدام NSNumberFormatter كما هو مقترح أو مجرد استخدام:

printf("%.2f\n", yourTimeInterval);
NSLog(@"%.2f\n", yourTimeInterval);

أو للحصول على NSSTRING، يمكنك أيضا استخدام ما يلي، والذي ربما يكون أسرع حتى استخدام برنامج التعداد (ومع ذلك، فلن يتم توطينه وفقا للمستخدم Prefs):

NSString * intervalStr = nil;
char * intervalStrTmp = NULL;
asprintf(&intervalStrTmp, "%.2f", yourTimeInteval);
if (intervalStrTmp) {
  intervalStr = [[NSString alloc] initWithUTF8String:intervalStrTmp];
  free(intervalStrTmp);
}

في الغالبية العظمى من الحالات، تقريب رقم هو شيء يجب أن تفعله في وقت العرض فقط. خصائص الأرقام الفاصلة العائمة (مزدوجة أم لا) تجعل من المستحيل تخزين أرقام معينة في الدقة الثابتة.

للحصول على معلومات حول تنسيق رقم بحيث يعرض إلى مكانين عشرين رؤية هذا المنصب الآخر.

هل هذا HumanReadableTimeInval. مساعدة؟ أنها ترجع nsstring، رغم ذلك. بدلا من ذلك، يمكنك جولة نفسك عن طريق مضاعفة 100، وتحويلها إلى عدد صحيح وتقسيم 100 مرة أخرى.

أود فقط استخدام ANSI C round() وظيفة.

يمكنك دائما تقريب الرقم باستخدام:

double round2dec(double a) { return round(a * 100) / 100; }

لكن الفرص هي أن تمثيل النتيجة لأن المزدوج لن يكون لديك عشرية فقط.

الآن، إذا باستخدام علامة ==، فكن تقصد أن مقارنة الأرقام المزدوجة الخاصة بك مصنوعة فقط إلى العشرية الثانية. هنا هو ما يمكنك القيام به:

fabs(round2dec(NSTimeInterval) - round2dec(double)) < std::numeric_limits<double>::epsilon()
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top