NSDecimalNumber的学习

NSDecimalNumber可以理解为一个十进制数字类,继承自NSNumber

 

初始化方法:

//flag 是否为负传YES OR  NO

- (instancetype)initWithMantissa:(unsigned long long)mantissa exponent:(short)exponent isNegative:(BOOL)flag;

 

- (instancetype)initWithDecimal:(NSDecimal)dcm NS_DESIGNATED_INITIALIZER;

NSDecimal是一个结构体

typedef struct {

    signed  int _exponent:8;

    unsigned int _length:4;     // length == 0 && isNegative -> NaN

    unsigned int _isNegative:1;

    unsigned int _isCompact:1;

    unsigned int _reserved:18;

    unsigned short _mantissa[NSDecimalMaxSize];

} NSDecimal;

NSDecimalNumber*price = [NSDecimalNumberdecimalNumberWithString:@"15.99"];

NSDecimalasStruct = [price decimalValue];

NSDecimalNumber*asNewObject = [NSDecimalNumberdecimalNumberWithDecimal:asStruct];


 

- (instancetype)initWithString:(nullable NSString *)numberValue;

 

//解析<numberValue>的字典(特别是NSLocaleDecimalSeparator:分割整数跟小数) (如@{NSLocaleDecimalSeparator:@","})

- (instancetype)initWithString:(nullable NSString *)numberValue locale:(nullable id)locale;

 

对应的类方法

+ (NSDecimalNumber *)decimalNumberWithMantissa:(unsigned long long)mantissa exponent:(short)exponent isNegative:(BOOL)flag;

+ (NSDecimalNumber *)decimalNumberWithDecimal:(NSDecimal)dcm;

+ (NSDecimalNumber *)decimalNumberWithString:(nullable NSString *)numberValue;

+ (NSDecimalNumber *)decimalNumberWithString:(nullable NSString *)numberValue locale:(nullable id)locale;

 

 

NSDecimalNumberHandler,是一个NSDecimalNumber的公共协议处理类,可以设置舍入模式以及计算错误的处理;配合NSDecimalNumber来使用,将这个类的实例当做NSDecimalNumber相应API的参数来控制数字处理的结果。

/** 初始化方法@param roundingMode 舍入方式

@param scale 小数点后舍入值的位数。

@param exact 精度错误处理;YES:如果出现错误,将引发异常,NO:忽略错误并将控制权放回给调用者。

@param overflow 溢出错误处理;YES:如果出现错误,将引发异常,NO:忽略错误并将控制权放回给调用者。

@param underflow 下溢错误处理;YES:如果出现错误,将引发异常,NO:忽略错误并将控制权放回给调用者。

@param divideByZero 除以0的错误处理;YES:如果出现错误,将引发异常,NO:忽略错误并将控制权放回给调用者。

@return NSDecimalNumberHandler对象*/

- (instancetype)initWithRoundingMode:(NSRoundingMode)roundingMode scale:(short)scale raiseOnExactness:(BOOL)exact raiseOnOverflow:(BOOL)overflow raiseOnUnderflow:(BOOL)underflow raiseOnDivideByZero:(BOOL)divideByZero NS_DESIGNATED_INITIALIZER;

typedef NS_ENUM(NSUInteger, NSRoundingMode) {

    NSRoundPlain,   // 四舍五入

    NSRoundDown,    // 只舍不入

    NSRoundUp,      //只入不舍

    NSRoundBankers  //在四舍五入的基础上加了一个判断:当最后一位为5的时候,只会舍入成偶数。比如:1.25不会返回1.3而是1.2,因为1.3不是偶数。

};

加减乘除:

- (NSDecimalNumber *)decimalNumberByAdding:(NSDecimalNumber *)decimalNumber;

- (NSDecimalNumber *)decimalNumberByAdding:(NSDecimalNumber *)decimalNumber withBehavior:(nullable id <NSDecimalNumberBehaviors>)behavior;

 

- (NSDecimalNumber *)decimalNumberBySubtracting:(NSDecimalNumber *)decimalNumber;

- (NSDecimalNumber *)decimalNumberBySubtracting:(NSDecimalNumber *)decimalNumber withBehavior:(nullable id <NSDecimalNumberBehaviors>)behavior;

 

- (NSDecimalNumber *)decimalNumberByMultiplyingBy:(NSDecimalNumber *)decimalNumber;

- (NSDecimalNumber *)decimalNumberByMultiplyingBy:(NSDecimalNumber *)decimalNumber withBehavior:(nullable id <NSDecimalNumberBehaviors>)behavior;

 

- (NSDecimalNumber *)decimalNumberByDividingBy:(NSDecimalNumber *)decimalNumber;

- (NSDecimalNumber *)decimalNumberByDividingBy:(NSDecimalNumber *)decimalNumber withBehavior:(nullable id <NSDecimalNumberBehaviors>)behavior;

//次方运算power 指数

- (NSDecimalNumber *)decimalNumberByRaisingToPower:(NSUInteger)power;

- (NSDecimalNumber *)decimalNumberByRaisingToPower:(NSUInteger)power withBehavior:(nullable id <NSDecimalNumberBehaviors>)behavior;

 

//10为底的乘方运算power 10的指数

- (NSDecimalNumber *)decimalNumberByMultiplyingByPowerOf10:(short)power;

- (NSDecimalNumber *)decimalNumberByMultiplyingByPowerOf10:(short)power withBehavior:(nullable id <NSDecimalNumberBehaviors>)behavior;

 

//舍入运算

- (NSDecimalNumber *)decimalNumberByRoundingAccordingToBehavior:(nullable id <NSDecimalNumberBehaviors>)behavior;

    // Round to the scale of the behavior.

 

- (NSComparisonResult)compare:(NSNumber *)decimalNumber;

 

 

NS_DESIGNATED_INITIALIZER:明确的告诉外部调用者,无论调用哪种初始化方法,最终,都会调用designed initializer

NS_DESIGNATED_INITIALIZER(指定初始化器)。
在OC中,对于多个方法实现初始化的时候,会指定其中一个做为NS_DESIGNATED_INITIALIZER,其于的初始化方法(简称Secondary initializers(次要初始化器))会调用指定初始化器来实现对象的创建。


最后附上一个比较详细的文档:

http://ios.eezytutorials.com/nsdecimalnumber-by-example.php

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值