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(次要初始化器))会调用指定初始化器来实现对象的创建。
最后附上一个比较详细的文档: