2012-09-03 34 views
5

NSNumber कोई अंश है या नहीं, यह जांचने का सबसे अच्छा तरीका क्या है?जांचें कि क्या NSNumber अंश है

NumberIsFraction(@(0)); // NO; 
NumberIsFraction(@(0.5)); // YES; 
NumberIsFraction(@(1.0)); // NO; 

सीमा केस हैंडलिंग और प्रदर्शन के मामले में "सर्वश्रेष्ठ"।

उत्तर

13

एक छोटे डोमेन के साथ प्रकारों में रूपांतरण से बचना:

BOOL NumberIsFraction(NSNumber *number) { 
    double dValue = [number doubleValue]; 
    if (dValue < 0.0) 
     return (dValue != ceil(dValue)); 
    else 
     return (dValue != floor(dValue)); 
} 
+0

मुझे लगता है कि वे '! =' होना चाहिए? 'नंबर IFraction (@ (0.0f))' 'हाँ 'वापस आ जाएगा, है ना? – hypercrypt

+0

आह, हाँ, brainfart। :) –

3

मैं वर्तमान में उपयोग कर रहा हूँ:

BOOL NumberIsFraction(NSNumber* number) { 
    return ![number isEqualToNumber:@(number.longLongValue)]; 
} 
+1

कि कई पूर्णांकों के लिए बहुत बड़ी काम करेंगे, लेकिन या बहुत ऋणात्मक पूर्णांक रूपांतरण के दौरान 'लंबे समय तक' से टूट जाएगा। –

1
-(BOOL) NumberIsFraction: (NSNumber*)number 
{ 
     NSLog(@"%0.16g",number.doubleValue); 
   NSLog(@"%d", number.intValue); 
   double diff = number.doubleValue - number.intValue; 
   if (diff>0) 
    return YES; 
    else return NO; 
} 
4

जोनाथन, hpique से समाधान, और प्रशांत सभी एक ही बग है : इसमें NSNumber का निर्धारण निश्चित-सटीक प्रकारों (विभिन्न double, long long इत्यादि) में कास्टिंग शामिल है), जो टूटता है यदि मान बहुत बड़ाहै। उदाहरण के लिए, स्वीकृत उत्तर NSDecimalNumber(string: "1000000000000000.1") पर विफल रहता है।

(विस्तार के रूप में, स्विफ्ट में) का अधिक सुरक्षित कार्यान्वयन:

extension NSNumber { 
    var isInteger: Bool { 
     var rounded = decimalValue 
     NSDecimalRound(&rounded, &rounded, 0, NSRoundingMode.RoundDown) 
     return NSDecimalNumber(decimal: rounded) == self 
    } 

    var isFraction: Bool { return !isInteger } 
} 

या ऑब्जेक्टिव-सी में, एक वैश्विक समारोह के रूप में:

BOOL NumberIsFraction(NSNumber *number) { 
    NSDecimal rounded = number.decimalValue; 
    NSDecimalRound(&rounded, &rounded, 0, NSRoundDown); 
    return ![number isEqualToNumber: 
     [[NSDecimalNumber alloc] initWithDecimal:rounded]]; 
}