iOS - OC NSNumber 数字

前言

    @interface NSNumber : NSValue
    @interface NSDecimalNumber : NSNumber
  • 将基本数据类型包装成 OC 对象

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

    // 基本数据类型 转 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];

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

    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");
        }

3、NSNumber 与 NSString 的相互转换

    NSNumber *num = [NSNumber numberWithFloat:10.456];

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

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

4、NSDecimalNumber 运算

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

    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];

4.2 四舍五入 运算

    /*
        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];

4.3 大小比较

    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。

        int x = arc4random() % 100;
  • 2、获取一个随机数范围在:[100, 200],包括 100,包括 200。
        int y = 100 + (arc4random() % 101);
  • 3、抽取方法,获取一个随机整数,范围在 [from, to],包括 from,包括 to。
        - (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() 来引用。
        printf("Random numbers are: %i %i", rand(), rand());
  • 2、伪随机数。
    • 因为 rand() 函数是按指定的顺序来产生整数,因此每次执行上面的语句都打印相同的两个值,所以说 C 语言的随机并不是真正意义上的随机,有时候也叫伪随机数。
    • 为了使程序在每次执行时都能生成一个新序列的随机值,我们通常通过为随机数生成器提供一粒新的随机种子。
    • 函数 srand()(来自 stdlib.h)可以为随机数生成器播散种子,称为随机数生成器的初始化器。只要种子不同 rand() 函数就会产生不同的随机数序列。
  • 3、用 rand() 随机生成在 [100, 200] 内的整数,包括 100,包括 200。
        // 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()。
        // 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 位长度的数字字母组合的随机数

        - (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;
        }
时间: 2024-10-29 17:17:43

iOS - OC NSNumber 数字的相关文章

iOS - OC 面向对象语法

1.类 1)根类:因为类 NSObject 是层次结构的最顶层,因此称为根类. 可以将类称为子类(subclass)和父类(superclass),也可以将类称为子类和超类. 2)分类/类别(category):允许以模块的方式向现有类定义添加新的方法(默认不能添加实例变量).扩展自己或他人以前实现的类,使它适合自己的需要. 分类的名称括在类名之后的一对圆括号"( )"中. @interface QCStudent (Print) @end @implementation QCStud

textfield 键盘-iOS textfield的数字键盘

问题描述 iOS textfield的数字键盘 把左边的灰色按钮 改为确定按钮 并能执行自定义方法 求大神 代码演示 解决方案 IOS自定义的数字键盘 FPNumberPadViewIOS中TextField点击取消键盘 解决方案二: 可以在键盘弹出时添加一个按钮大小与右下角灰色格大小一样添加对应功能键盘收回时remove掉

ios oc对象不可以直接写到plist中..

问题描述 ios oc对象不可以直接写到plist中.. ios oc对象不可以直接写到plist中..ios oc对象不可以直接写到plist中..ios oc对象不可以直接写到plist中.. 解决方案 你可以写到 NSUserDefault 中, 也就是常说的 User setting, 可以把它当 NSDictionary 来用. 解决方案二: 必须是nsstring,array,dictionary,set等的子类 解决方案三: plist里面一般都是字典数组字符串之类的,你要存对象得

iOS - OC NSString 字符串

前言 @interface NSString : NSObject <NSCopying, NSMutableCopying, NSSecureCoding> @interface NSMutableString : NSString 1.不可变字符串的创建 // 直接创建不可变字符串 /* 在 OC 中,使用 @"XXX" 格式定义的字符串,是保存在常量区的,只要内容相同,内存地址就一致 */ NSString *string1 = @"bei jing hua

iOS - OC Enum 枚举

前言 iOS 5.0 之后,提供了新的枚举定义方式,定义枚举的同时,可以指定枚举中数据的类型. typedef NS_OPTIONS(_type, _name) new; -> 位移的,可以使用 按位或 设置数值 typedef NS_ENUM(_type, _name) new; -> 数字的,直接使用枚举设置数值 位移型枚举: 使用 按位或 可以给一个参数同时设置多个 "类型".在具体执行的时候,使用 按位与 可以判断具体的 "类型". OC 中 6

iOS - OC Foundation 框架

前言 框架是由许多类.方法.函数和文档按照一定的逻辑组织起来的集合,以使研发程序更容易. Foundation 框架:为所有程序开发奠定基础的框架称为 Foundation 框架. Cocoa :是指 Foundation .Core Data 和 AppKit(Application Kit)框架.用于 Mac OS X 设备上的应用程序开发. Cocoa Touch :是指 Foundation .Core Data 和 UIKit 框架.用于 iOS 设备上的应用程序开发. 1.Found

iOS - OC 语言新特性

前言 相对于 Java,OC 语言是一门古老的语言了,而它又是一门不断发展完善的语言.一些新的编译特性,为 OC 语言带来了许多新的活力.在 Xcode7 中,iOS9 的 SDK 已经全面兼容了 Objective-C 的一些新特 性和新功能.这些功能都只作用于编译期,对程序的运行并没有影响,因此,它可以很好的向下进行兼容,无缝的衔接低版本的 iOS 系统,如果可以将这些新特性都应用于开发,开发效率和代码质量,相比之前会有一个很大的提升. 1.可选类型检测 在 swift 语言中,通过 ! 和

iOS - OC 内存管理

1.OC 基本内存管理模型 1.1 自动垃圾收集 在 OC 2.0 中,有一种称为垃圾收集的内存管理形式.通过垃圾收集,系统能够自动监测对象是否拥有其他的对象,当程序执行需要空间的时候,不再被引用的对象会自动释放.iOS 运行环境并不支持垃圾收集,在这个平台开发程序时并没有这方面的选项.在 OS X 10.8 中垃圾收集已不再推荐使用. 1.2 自动释放池 自动释放池(autoreleasepool)的机制是它使得应用在创建新对象时,系统能够有效的管理应用所使用的内存.自动释放池可以追踪需要延时

iOS - OC NSArray 数组

前言 @interface NSArray<__covariant ObjectType> : NSObject <NSCopying, NSMutableCopying, NSSecureCoding, NSFastEnumeration> @interface NSMutableArray<ObjectType> : NSArray<ObjectType> 数组只能存储 OC 对象,不能存储 C 语言中的基本数据类型,也不能存储 nil . Xcode