NSDecimalNumber类

NSDecimalNumber是NSNumber的子类,比NSNumber的功能更为强大,可以指定一个数的幂,四舍五入等操作。NSString类型转化成CGFloat、CGDouble类型,使用floatValue、doubleValue 等方法结果精度不高的情况。例如 @"8" -> 7.99999    @"1.0" -> 1.00001 @"12.9"->12.8999

由于NSDecimalNumber精度较高,所以会比基本数据类型费时,所以需要权衡考虑,苹果官方建议在货币以及要求精度很高的场景下使用。 

一、一些科学计数法的简单方法。

 //一个关于科学计数法的方法:参数 1.mantissa 实数 2.exponent 指数 3.flag 正负

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

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

例:mantissa = 6 ,exponent = 2 ,flag = false    结果:6*10^2 = 600。

//一个科学计数法的初始化方法:numberValue 字符串(详情见官方文档)

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

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

例:NSDecimalNumber *a = [[NSDecimalNumber alloc] initWithString:@"-4e3"]; 输出:-4000。 

二、NSDecimalNumber 对象值进行操作

//一些基本赋值

+ (NSDecimalNumber *)zero;              //Returns an NSDecimalNumber object equivalent to the number 1.0.

+ (NSDecimalNumber *)one;              //Returns an NSDecimalNumber object equivalent to the number 0.0.

+ (NSDecimalNumber *)minimumDecimalNumber;    //-340282366920938463463374607431768211455

+ (NSDecimalNumber *)maximumDecimalNumber;+ (NSDecimalNumber *)notANumber;          //Returns an NSDecimalNumber object that specifies no number.非数字

例:enum {  NSRoundPlain,//四舍五入 

NSRoundDown,//只舍不入 

NSRoundUp,//只入不舍NSRoundBankers 

//近似于圆};

typedef NSUInteger NSRoundingMode;

//NSDecimalNumberBehaviors对象的创建  参数 1.RoundingMode 一个取舍枚举值 2.scale 处理范围 3.raiseOnExactness  精确出现异常是否抛出原因 4.raiseOnOverflow  上溢出是否抛出原因  4.raiseOnUnderflow  下溢出是否抛出原因  5.raiseOnDivideByZero  除以0是否抛出原因。

NSDecimalNumber * a = [NSDecimalNumber decimalNumberWithString:@"2.5301"];

NSDecimalNumber * b = [NSDecimalNumber decimalNumberWithString:@"7.5001"];

NSDecimalNumberHandler *roundingBehavior = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundBankers scale:2  raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO  raiseOnDivideByZero:NO]

//加法运算  参数 behavior 对的到的结构做一些限制(后面有说明)

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

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

NSDecimalNumber *c = [a decimalNumberByAdding:b];  结果:10.032  NSDecimalNumber *c = [a decimalNumberByAdding:b withBehavior:roundingBehavior]; 结果:10.03

//减法运算

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

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

NSDecimalNumber *c = [a decimalNumberBySubtracting:b]; 结果:-4.97    NSDecimalNumber *c = [a decimalNumberBySubtracting:b withBehavior:roundingBehavior]; 结果:-4.97

//乘法运算

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

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

NSDecimalNumber *c = [a decimalNumberByMultiplyingBy:b]; 结果:18.97600301

NSDecimalNumber *c = [a decimalNumberByMultiplyingBy:b withBehavior:roundingBehavior]; 结果:18.98

//除法运算

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

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

NSDecimalNumber *c = [a decimalNumberByDividingBy:b]; 结果:0.3373421687710830522259703203957280

NSDecimalNumber *c = [a decimalNumberByDividingBy:b withBehavior:roundingBehavior]; 结果:0.34

//a的n次方 参数 

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

NSDecimalNumber *c = [a decimalNumberByRaisingToPower:3];  结果:16.196197345901

NSDecimalNumber *c = [a decimalNumberByRaisingToPower:3 withBehavior:roundingBehavior]; 结果:16.2

//指数运算 

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

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

//四舍五入

- (NSDecimalNumber *)decimalNumberByRoundingAccordingToBehavior:(nullable id)behavior;

NSDecimalNumber *c = [a decimalNumberByRoundingAccordingToBehavior:roundingBehavior]; 结果:2.53

//两数比较

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

NSLog(@"%ld",(long)[a compare:b]); 结果 -1.

//设置默认的behaviors对象

+ (void)setDefaultBehavior:(id)behavior;+ (id)defaultBehavior;

注:后面全部设为 NO 的话,默认只进行后两位的的四舍五入操作,再多就是直接舍去。 需要更精确的四舍五入需要scale后面参数某个改为YES。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容