NSNumber 数字

前言

  • NSNumber 数字

    • Objective-C

      1
      2
      @interface NSNumber : NSValue
      @interface NSDecimalNumber : NSNumber
    • Swift

      1
      2
      public class NSNumber : NSValue
      public class NSDecimalNumber : NSNumber
    • 将基本数据类型包装成对象。

    • NSNumber 可以被赋值为各种数值类型。我们可以将一个 Int 类型的值直接传递给一个需要 NSNumber 类型参数或变量,Swift 会自动转换,如果两者类型不一致,会强制类型转换。

    • 从 NSNumber 赋值给 Swift 数值类型是,数值类型会根据会更具声明类型将 NSNumber 强制转换。

1、NSNumber 与 基本数据类型 的相互转换

  • Objective-C

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    // 基本数据类型 转 NSNumber

    // 对象方法,将整形数据转换为 OC 对象
    NSNumber *num1 = [[NSNumber alloc] initWithInt:123];

    // 类方法, 将浮点型数据转换成 OC 对象
    NSNumber *num2 = [NSNumber numberWithFloat:10.456];

    // @ + 基本数据类型 直接创建
    NSNumber *num3 = @234;

    NSNumber *num4 = @0xabcdefL;
    NSNumber *num5 = @'S';
    NSNumber *num6 = @100.0f;

    int a = 123;
    float b = 200.0f;

    // @ + 表达式 直接创建
    NSNumber *num7 = @((a + b) / 2.0);

    // NSNumber 转 基本数据类型

    int n1 = [num1 intValue];
    float n2 = [num2 floatValue];

    NSInteger n3 = [num3 integerValue];
    long n4 = [num4 longValue];
    char n5 = [num5 charValue];
    float n6 = [num6 floatValue];

    float n7 = [num7 floatValue];
  • Swift

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    // Swift 数字 转 NSNumber

    let nsNum1:NSNumber = 1

    let nsNum2 = NSNumber(integer: 1)
    let nsNum3 = NSNumber(unsignedInteger: 1)
    let nsNum4 = NSNumber(float: 1.1)
    let nsNum5 = NSNumber(double: 3.2)
    let nsNum6 = NSNumber(bool: true)

    // NSNumber 转 Swift 数字

    let num1 = nsNum1.integerValue
    let num2 = nsNum2.unsignedIntegerValue
    let num3 = nsNum3.floatValue
    let num4 = nsNum4.doubleValue
    let num5 = nsNum5.boolValue

2、比较两个 NSNumber 类型数据的大小

  • Objective-C

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    NSNumber *num1 = [NSNumber numberWithFloat:123];
    NSNumber *num2 = [NSNumber numberWithFloat:10.456];

    // isEqualToNumber

    BOOL bl = [num1 isEqualToNumber:num2];

    // compare

    NSComparisonResult result = [num1 compare:num2];

    if (result == NSOrderedAscending) {
    NSLog(@"num1 < num2");
    } else if (result == NSOrderedSame) {
    NSLog(@"num1 == num2");
    } else {
    NSLog(@"num1 > num2");
    }
  • Swift

    1
    2
    3
    4
    5
    6
    7
    8
    let nsNum1:NSNumber = 10
    let nsNum2:NSNumber = 10.1

    // 判断两个值是否相等
    let bl:Bool = nsNum1.isEqualToNumber(nsNum2)

    // 判断两个值的大小
    let result:NSComparisonResult = nsNum1.compare(nsNum2)

3、NSNumber 与 NSString 的相互转换

  • Objective-C

    1
    2
    3
    4
    5
    6
    7
    NSNumber *num = [NSNumber numberWithFloat:10.456];

    // NSNumber 转换 NSString
    NSString *str = [num stringValue];

    // NSString 转 NSNumber
    NSNumber *num1 = [NSNumber numberWithFloat:[str floatValue]];
  • Swift

    1
    2
    3
    4
    5
    // NSNumber 转换 NSString
    let str:String = NSNumber(float: 10.456).stringValue

    // NSString 转 NSNumber
    let nsNum:NSNumber = NSNumber(float: NSString(string: str).floatValue)

4、NSDecimalNumber 运算

4.1 加、减、乘、除、n 次方 运算

  • Objective-C

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    NSDecimalNumber *dcNun1 = [NSDecimalNumber decimalNumberWithString:@"15.99"];
    NSDecimalNumber *dcNun2 = [NSDecimalNumber decimalNumberWithString:@"29.99"];
    NSDecimalNumber *dcNun3 = [NSDecimalNumber decimalNumberWithString:@"5.00"];
    NSDecimalNumber *dcNun4 = [NSDecimalNumber decimalNumberWithString:@".90"];
    NSDecimalNumber *dcNun5 = [NSDecimalNumber decimalNumberWithString:@"2.0"];

    // 加 Adding
    NSDecimalNumber *subtotal = [dcNun1 decimalNumberByAdding:dcNun2];

    // 减 Subtracting
    NSDecimalNumber *afterCoupon = [subtotal decimalNumberBySubtracting:dcNun3];

    // 乘 Multiplying
    NSDecimalNumber *afterDiscount = [afterCoupon decimalNumberByMultiplyingBy:dcNun4];

    // 平均 Dividing
    NSDecimalNumber *average = [afterDiscount decimalNumberByDividingBy:dcNun5];

    // n 次方 RaisingToPower
    NSDecimalNumber *averageSquared = [average decimalNumberByRaisingToPower:2];
  • Swift

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    let dcNun1 = NSDecimalNumber(string:"15.99")
    let dcNun2 = NSDecimalNumber(string:"29.99")
    let dcNun3 = NSDecimalNumber(string:"5.00")
    let dcNun4 = NSDecimalNumber(string:".90")
    let dcNun5 = NSDecimalNumber(string:"2.0")

    // 加 Adding
    let subtotal = dcNun1.decimalNumberByAdding(dcNun2)

    // 减 Subtracting
    let afterCoupon = subtotal.decimalNumberBySubtracting(dcNun3)

    // 乘 Multiplying
    let afterDiscount = afterCoupon.decimalNumberByMultiplyingBy(dcNun4)

    // 平均 Dividing
    let average = afterDiscount.decimalNumberByDividingBy(dcNun5)

    // n 次方 RaisingToPower
    let averageSquared = average.decimalNumberByRaisingToPower(2)

4.2 四舍五入 运算

  • Objective-C

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    /*
    NSRoundPlain, // Round up on a tie 貌似取整
    NSRoundDown, // Always down == truncate 只舍不入
    NSRoundUp, // Always up 只入不舍
    NSRoundBankers // on a tie round so last digit is even 貌似四舍五入
    */

    // 90.7049 + 0.22 然后四舍五入

    NSDecimalNumberHandler *roundUp = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundBankers
    scale:2
    raiseOnExactness:NO
    raiseOnOverflow:NO
    raiseOnUnderflow:NO
    raiseOnDivideByZero:YES];

    NSDecimalNumber *subtotal = [NSDecimalNumber decimalNumberWithString:@"90.7049"];
    NSDecimalNumber *discount = [NSDecimalNumber decimalNumberWithString:@"0.22"];

    // 加 保留 2 位小数
    NSDecimalNumber *total = [subtotal decimalNumberByAdding:discount withBehavior:roundUp];
  • Swift

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    /*
    enum NSRoundingMode : UInt {

    case RoundPlain // Round up on a tie 貌似取整
    case RoundDown // Always down == truncate 只舍不入
    case RoundUp // Always up 只入不舍
    case RoundBankers // on a tie round so last digit is even 貌似四舍五入
    }
    */

    // 90.7049 + 0.22 然后四舍五入

    let roundUp = NSDecimalNumberHandler(roundingMode: NSRoundingMode.RoundBankers,
    scale: 2,
    raiseOnExactness: false,
    raiseOnOverflow: false,
    raiseOnUnderflow: false,
    raiseOnDivideByZero: true)

    let subtotal = NSDecimalNumber(string:"90.7049")
    let discount = NSDecimalNumber(string:"0.22")

    // 加 保留 2 位小数
    let total = subtotal.decimalNumberByAdding(discount, withBehavior: roundUp)

4.3 大小比较

  • Objective-C

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    NSDecimalNumber *dcNum1 = [NSDecimalNumber decimalNumberWithString:@".85"];

    NSDecimalNumber *dcNum2 = [NSDecimalNumber decimalNumberWithString:@".9"];

    NSComparisonResult result = [dcNum1 compare:dcNum2];

    if (result == NSOrderedAscending) {

    NSLog(@"85%% < 90%% 小于");

    } else if (result == NSOrderedSame) {

    NSLog(@"85%% == 90%% 等于");

    } else if (result == NSOrderedDescending) {

    NSLog(@"85%% > 90%% 大于");
    }

5、random 随机数

  • 随机数在 C 中提供了 rand()、srand()、random()、arc4random() 几个函数。

5.1 使用 arc4random() 生成随机数

  • 1、获取一个随机整数范围在:[0, 100) 包括 0,不包括 100。

    • Objective-C

      1
      int x = arc4random() % 100;
  • 2、获取一个随机数范围在:[100, 200],包括 100,包括 200。

    • Objective-C

      1
      int y = 100 + (arc4random() % 101);
  • 3、抽取方法,获取一个随机整数,范围在 [from, to],包括 from,包括 to。

    • Objective-C

      1
      2
      3
      - (int)getRandomNumber:(int)from to:(int)to {
      return (int)(from + (arc4random() % (to - from + 1)));
      }

5.2 使用 rand() 生成随机数

  • 在标准的 C 库中,函数 rand() 可以生成 0 ~ RAND_MAX 之间的一个随机数,其中 RAND_MAX 是 stdlib.h 中定义的一个整数,它与系统有关。

  • 1、rand() 函数没有输入参数,直接通过表达式 rand() 来引用。

    • Objective-C

      1
      printf("Random numbers are: %i %i", rand(), rand());
  • 2、伪随机数。

    • 因为 rand() 函数是按指定的顺序来产生整数,因此每次执行上面的语句都打印相同的两个值,所以说 C 语言的随机并不是真正意义上的随机,有时候也叫伪随机数。

    • 为了使程序在每次执行时都能生成一个新序列的随机值,我们通常通过为随机数生成器提供一粒新的随机种子。

    • 函数 srand()(来自 stdlib.h)可以为随机数生成器播散种子,称为随机数生成器的初始化器。只要种子不同 rand() 函数就会产生不同的随机数序列。

  • 3、用 rand() 随机生成在 [100, 200] 内的整数,包括 100,包括 200。

    • Objective-C

      1
      2
      3
      4
      // k 即为所求范围内随机生成的数,rand() % a 的结果最大为 a - 1

      srand((unsigned)time(0));
      int k = 100 + (rand() % 101);

5.3 rand() 和 random()、arc4random() 比较

  • rand() 实际并不是一个真正的随机数发生器,在使用之前需要先初始化随机种子,否则每次生成的随机数一样。

  • arc4random() 是一个真正的随机数发生器,不需要生成随机种子,因为第一次调用的时候就会自动生成。而且范围是 rand() 的两倍,在 iPhone 中,RAND_MAX 是 0x7fffffff (2147483647),而arc4random() 返回的最大值则是 0x100000000 (4294967296)。

  • 精确度比较:arc4random() > random() > rand()。

    • Objective-C

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      // rand()
      srand((unsigned)time(0)); // 不加这句每次产生的随机数不变
      int i = rand() % 100;

      // random()
      srandom(time(0)); // 不加这句每次产生的随机数不变
      int i = random() % 100;

      // arc4random()
      int i = arc4random() % 100;

5.4 生成指定长度的随机数

  • 生成 15 位长度的数字字母组合的随机数

    • Objective-C

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      - (NSString *)getRandomString {

      static int kNumber = 15;

      NSString *sourceStr = @"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
      NSMutableString *resultStr = [[NSMutableString alloc] init];

      for (int i = 0; i < kNumber; i++) {

      NSUInteger index = arc4random() % sourceStr.length;
      NSString *oneStr = [sourceStr substringWithRange:NSMakeRange(index, 1)];

      [resultStr appendString:oneStr];
      }
      return resultStr;
      }
文章目录
  1. 1. 前言
  2. 2. 1、NSNumber 与 基本数据类型 的相互转换
  3. 3. 2、比较两个 NSNumber 类型数据的大小
  4. 4. 3、NSNumber 与 NSString 的相互转换
  5. 5. 4、NSDecimalNumber 运算
    1. 5.1. 4.1 加、减、乘、除、n 次方 运算
    2. 5.2. 4.2 四舍五入 运算
    3. 5.3. 4.3 大小比较
  6. 6. 5、random 随机数
    1. 6.1. 5.1 使用 arc4random() 生成随机数
    2. 6.2. 5.2 使用 rand() 生成随机数
    3. 6.3. 5.3 rand() 和 random()、arc4random() 比较
    4. 6.4. 5.4 生成指定长度的随机数
隐藏目录