iOS开发NSDecimalNumber的使用,货币计算/精确数值计算/保留位数等

NSDecimalNumber

NSDecimalNumber,不可变NSNumber 的子类,提供了一个面向对象的十进制运算包装器 。实例可以代表任意数值,表示为(mantissa)尾数x 10 ^(exponent)指数,(mantissa)尾数是一个十进制整数到38位长,(exponent)指数是一个整数从-128年到127。

创建Decimal Number

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

参数表示 一个number的科学记数法 ,要求(mantissa)尾数是一个整数。例如,如果表示的数是-12.345,它是表示为12345 x10 ^ 3   -mantissa 是12345;(exponent)指数是3;和isNegative(一个布尔值,用于指定number 的(sign)符号是负的)是YES,如下例所示。

Objective-C

NSDecimalNumber *number = [NSDecimalNumber decimalNumberWithMantissa:12345

exponent:-3

isNegative:YES];

1

2

3

NSDecimalNumber*number=[NSDecimalNumberdecimalNumberWithMantissa:12345

exponent:-3

isNegative:YES];

+ (NSDecimalNumber *)decimalNumberWithDecimal:(NSDecimal)decimal

给定一个NSDecimal数据结构,创建并返回一个等价的 NSDecimalNumber对象

+ (NSDecimalNumber *)decimalNumberWithString:(NSString *)numericString

创建并返回一个NSDecimalNumber对象值相当于个给定的数字字符串。

numericString:除了数字字符串,numericString可以包括一个“+”或“-”,一个“E”或“E”,用科学记数法表示一个数的指数,和一个NSLocaleDecimalSeparator划分的部分数的有效组成部分。

+ (NSDecimalNumber *)decimalNumberWithString:(NSString *)numericString  locale:(id)locale

locale:一个字典定义语言环境(特别是NSLocaleDecimalSeparator),在进行解析numericString的时候

numericString:除了数字字符串,numericString可以包括一个“+”或“-”,一个“E”或“E”,用科学记数法表示一个数的指数,和一个NSLocaleDecimalSeparator划分的部分数的有效组成部分。

Objective-C

NSDictionary *locale = @{NSLocaleDecimalSeparator :@","]; //以","当做分隔符格式

NSDecimalNumber *discountAmount = [NSDecimalNumber decimalNumberWithString:@"123,40" locale:locale]; //123.4

1

2

NSDictionary*locale=@{NSLocaleDecimalSeparator:@","];//以","当做分隔符格式

NSDecimalNumber*discountAmount=[NSDecimalNumberdecimalNumberWithString:@"123,40"locale:locale];//123.4

以下是numericString的一些正确示例:

“2500.6” (or “2500,6”, 取决于 locale)

“–2500.6” (or “–2500.6”)

“–2.5006e3” (or “–2,5006e3”)

“–2.5006E3” (or “–2,5006E3”)

以下是numericString的一些错误示例:

“2,500.6”

“2500 3/5”

“2.5006x10e3”

“two thousand five hundred and six tenths”

+ (NSDecimalNumber *)one

一个 等同于 1.0的NSDecimalNumber对象

+ (NSDecimalNumber *)zero

一个 等同于 0.0的NSDecimalNumber对象

+ (NSDecimalNumber *)notANumber

没有指定数值的NSDecimalNumber对象

常用于对比,比如:[[NSDecimalNumber notANumber] isEqualToNumber:myNumber];

初始化Decimal Number

- (instancetype)initWithDecimal:(NSDecimal)decimal

一个NSDecimalNumber使用给定decimal对象初始化

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

使用(mantissa)尾数, (exponent)指数 number 的(sign)符号,来初始化NSDecimalNumber

- (instancetype)initWithString:(NSString *)numericString

创建并返回一个NSDecimalNumber对象值相当于个给定的numericString数字字符串。

numericString:除了数字字符串,numericString可以包括一个“+”或“-”,一个“E”或“E”,用科学记数法表示一个数的指数,和一个NSLocaleDecimalSeparator划分的部分数的有效组成部分。

- (instancetype)initWithString:(NSString *)numericString  locale:(id)locale

以numericString,locale初始化NSDecimalNumber对象

locale:一个字典定义语言环境(特别是NSLocaleDecimalSeparator),在进行解析numericString的时候

numericString:除了数字字符串,numericString可以包括一个“+”或“-”,一个“E”或“E”,用科学记数法表示一个数的指数,和一个NSLocaleDecimalSeparator划分的部分数的有效组成部分。

加法运算

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

返回一个新的NSDecimalNumber对象, 值 是接收方与另一个给定NSDecimalNumber对象的总和。

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

加上decimalNumber给接受者并返回一个新创建的NSDecimalNumber对象。

behavior:指定的如何处理计算错误和舍入行为。

减法运算

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

返回一个新的NSDecimalNumber对象,其值是调用者减去另一个给定NSDecimalNumber对象的值。

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

返回一个新的NSDecimalNumber对象,其值是调用者减去另一个给定NSDecimalNumber对象的值。

behavior:指定的如何处理计算错误和舍入行为。

乘法运算

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

返回一个新的NSDecimalNumber对象,其值是调用者乘以另一个给定NSDecimalNumber对象的值。

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

返回一个新的NSDecimalNumber对象,其值是调用者乘以另一个给定NSDecimalNumber对象的值。

behavior:指定的如何处理计算错误和舍入行为。

除法运算

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

返回一个新的NSDecimalNumber对象,其值是调用者除以另一个给定NSDecimalNumber对象的值。

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

返回一个新的NSDecimalNumber对象,其值是调用者除以另一个给定NSDecimalNumber对象的值。

behavior:指定的如何处理计算错误和舍入行为。

a的N次方

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

返回一个新的NSDecimalNumber对象,其值是调用者 的power次方。

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

返回一个新的NSDecimalNumber对象,其值是调用者 的power次方。

behavior:指定的如何处理计算错误和舍入行为。

指数运算

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

返回一个新的NSDecimalNumber对象,其值是调用者乘以10的power次方。

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

返回一个新的NSDecimalNumber对象,其值是调用者乘以10的power次方。

behavior:指定的如何处理计算错误和舍入行为。

四舍五入

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

返回一个新的NSDecimalNumber对象,其值是调用者四舍五入过后的值。

behavior:指定的如何处理计算错误和舍入行为。

Objective-C

NSDecimalNumberHandler * handler = [[NSDecimalNumberHandler alloc] initWithRoundingMode:NSRoundPlain scale:scale raiseOnExactness:NO raiseOnOverflow:YES raiseOnUnderflow:YES raiseOnDivideByZero:YES];

NSDecimalNumber *result [nummber decimalNumberByRoundingAccordingToBehavior:handler];

1

2

NSDecimalNumberHandler*handler=[[NSDecimalNumberHandleralloc]initWithRoundingMode:NSRoundPlainscale:scaleraiseOnExactness:NOraiseOnOverflow:YESraiseOnUnderflow:YESraiseOnDivideByZero:YES];

NSDecimalNumber*result[nummberdecimalNumberByRoundingAccordingToBehavior:handler];

描述不同的舍入方式,查看NSDecimalNumberBehaviors协议规范的roundingMode方法。

roundingMode四舍五入策略

Objective-C

// Original

// value 1.2 1.21 1.25 1.35 1.27

// NSRoundPlain 1.2 1.2 1.3 1.4 1.3

// NSRoundDown 1.2 1.2 1.2 1.3 1.2

// NSRoundUp 1.2 1.3 1.3 1.4 1.3

// NSRoundBankers 1.2 1.2 1.2 1.4 1.3

1

2

3

4

5

6

7

// Original

//    value 1.2  1.21  1.25  1.35  1.27

// NSRoundPlain    1.2  1.2   1.3   1.4   1.3

// NSRoundDown     1.2  1.2   1.2   1.3   1.2

// NSRoundUp       1.2  1.3   1.3   1.4   1.3

// NSRoundBankers  1.2  1.2   1.2   1.4   1.3

访问值

@property(readonly) NSDecimal decimalValue

十进制数最近似的double值。(只读)

- (NSString *)descriptionWithLocale:(id)locale

根据给定的locale返回number的字符串

@property(readonly) const char *objCType

Objective- C的C字符串类型的数据,包含小数对象。(只读)

管理 Behavior

+ (id)defaultBehavior

返回的算术的方法、像decimalNumberByAdding:四舍五入和处理错误的条件。默认情况下,算术方法使用NSRoundPlain行为;也就是说,四舍五入最可能的返回值的方法。方法假定你需要精度不超过38个有效数字,当他们试图除以0或产生一个数表示太大或太小的时候发生异常。

如果这种默认行为不适合您的应用程序,您应该使用这个方法,让您可以指定行为,像decimalNumberByAdding:withBehavior:。如果你发现自己一直使用一个特定的行为,您可以指定一个不同的默认行为setDefaultBehavior:。

在你的应用程序中默认行为是单独为每个线程维护。

比较 Decimal Numbers

- (NSComparisonResult)compare:(NSNumber *)decimalNumber

返回一个NSComparisonResult值表明调用者和另一个给定的数字NSDecimalNumber对象的顺序大小。

NSOrderedAscending 如果decimalNumber的价值大于调用者;

NSOrderedSame 如果它们相等;

NSOrderedDescending 如果decimalNumber小于调用者的值。

Objective-C

NSDecimalNumber *discount1 = [NSDecimalNumber decimalNumberWithString:@"1.2"];

NSDecimalNumber *discount2 = [NSDecimalNumber decimalNumberWithString:@"1.3"];

NSComparisonResult result = [discount1 compare:discount2];

if (result == NSOrderedAscending) {

NSLog(@"1.2 < 1.3");

} else if (result == NSOrderedSame) {

NSLog(@"1.2 == 1.3");

} else if (result == NSOrderedDescending) {

NSLog(@"1.2 > 1.3");

}

1

2

3

4

5

6

7

8

9

10

NSDecimalNumber*discount1=[NSDecimalNumberdecimalNumberWithString:@"1.2"];

NSDecimalNumber*discount2=[NSDecimalNumberdecimalNumberWithString:@"1.3"];

NSComparisonResultresult=[discount1compare:discount2];

if(result==NSOrderedAscending){

NSLog(@"1.2 < 1.3");

}elseif(result==NSOrderedSame){

NSLog(@"1.2 == 1.3");

}elseif(result==NSOrderedDescending){

NSLog(@"1.2 > 1.3");

}

获取 最大最小可能值

+ (NSDecimalNumber *)maximumDecimalNumber

返回一个NSDecimalNumber对象的最大可能值。

+ (NSDecimalNumber *)minimumDecimalNumber

返回一个NSDecimalNumber对象的最小可能值。

常量 Constants

NSDecimalNumber 异常名称

列出了各种异常的名字 表明NSDecimalNumber计算错误。

Objective-C

extern NSString *NSDecimalNumberExactnessException; //如果出现一个精确的错误

extern NSString *NSDecimalNumberOverflowException; // 溢出

extern NSString *NSDecimalNumberUnderflowException; //下溢

extern NSString *NSDecimalNumberDivideByZeroException; //除数为0

1

2

3

4

externNSString*NSDecimalNumberExactnessException;//如果出现一个精确的错误

externNSString*NSDecimalNumberOverflowException;// 溢出

externNSString*NSDecimalNumberUnderflowException;//下溢

externNSString*NSDecimalNumberDivideByZeroException;//除数为0

bool转nsnumber ios_iOS开发之NSDecimalNumber的使用,货币计算/精确数值计算/保留位数等...相关推荐

  1. bool转nsnumber ios_iOS 的 NSNumber(对基本数据类型) NSValue(对结构体) 的装箱

    int. NSInteger. NSUInteger.NSNumber之间的区别和联系 int : 当使用int类型定义变量的时候,可以像写C程序一样,用int也可以用NSInteger,推荐使用NS ...

  2. iOS开发之AVKit框架使用

    2019独角兽企业重金招聘Python工程师标准>>> iOS开发之AVKit框架使用 一.引言 在iOS开发框架中,AVKit是一个非常上层,偏应用的框架,它是基于AVFounda ...

  3. Flutter开发之ListView下拉刷新上拉加载更多(35)

    在Flutter开发之ListView组件(21) 文章中,我们了解了ListView组件的基本使用.但是数据比较少,没有涉及分页加载.而实际开发中,下拉刷新和分页加载几乎是所有APP的标配.在iOS ...

  4. (0045) iOS 开发之MBProgressHUD 源码学习

    (0045) iOS 开发之MBProgressHUD 源码学习 第一部分:学习所得和分析线程 1.  学习到了kvo 的使用 和屏幕方向的旋转判断. 2. 如果调起这个 HUD 的方法不是在主线程调 ...

  5. IOS开发之JSON序列化从客户端发送到服务器端

    IOS开发之JSON序列化从客户端发送到服务端的准备工作 共有6种情况 需要序列化 请查看源代码. 服务器端接受我们采用的是java的Tomcat服务器.配合 struts 2 controller框 ...

  6. android 开发art,Android应用开发之Android 系统启动原理(art 虚拟机)

    本文将带你了解Android应用开发之Android 系统启动原理(art 虚拟机),希望本文对大家学Android有所帮助. Android   系统启动原理(art 虚拟机) 一.虚拟机的启动 A ...

  7. 【Win10】UAP/UWP/通用 开发之 x:Bind

    [Win10]UAP/UWP/通用 开发之 x:Bind [Some information relates to pre-released product which may be substant ...

  8. ArcGIS Engine开发之旅08--和查询相关的对象和接口

    ArcGIS Engine开发之旅08--和查询相关的对象和接口 原文:ArcGIS Engine开发之旅08--和查询相关的对象和接口 查询在GIS领域应该是一个很频繁的操作,在GIS中除了具有属性 ...

  9. iOS开发之Accounts框架详解

    2019独角兽企业重金招聘Python工程师标准>>> iOS开发之Accounts框架详解 Accounts框架是iOS原生提供的一套账户管理框架,其支持Facebook,新浪微博 ...

最新文章

  1. 1900万印度人疯抢6万份工作,加班至死,这才是真正的就业崩溃!
  2. linux:交叉编译后程序的下载方式
  3. MySQL 优化之 index merge(索引合并)
  4. Win10自带的邮件客户端配置腾讯企业邮箱账号
  5. js-ajax-04
  6. HDU多校6 - 6836 Expectation(矩阵树定理+高斯消元求行列式)
  7. 粒子文字特效css,CSS3 粒子效果
  8. 2021 年 JavaScript 大事记
  9. java根据sessionid获取session
  10. c语言广播程序,C语言socket编程---udp通信及广播
  11. 数据结构与算法——广度搜索BFS
  12. mysql 5.7.18源码包下载_centos 7 下MySQL 5.7.18 源码安装
  13. 浅谈Vue 中的 computed 和 methods 的使用
  14. 不能安装_监控安装不能忽视的要点
  15. 计算机格式化为ntfs,u盘无法格式化成ntfs怎么办解决教程
  16. 【408考研笔记】操作系统完整知识点
  17. 2021年电工(初级)考试题及电工(初级)找解析
  18. 图像分割(语义分割)的局限以及解决方法
  19. 基于ZFC公理系统的无穷小微积分学
  20. php教育网站设计案例_课程教学网站的设计与实现(MySQL)(含录像)

热门文章

  1. Dockerfile文件中CMD指令与ENTRYPOINT指令的区别
  2. Dockerfile 文件结构、docker镜像构建过程详细介绍
  3. css技巧中placeholder的颜色
  4. 递归函数非递归化_递归神秘化
  5. 如何破解Mac并为其提供真正应得的精美壁纸
  6. MATLAB中矩阵与数组的区别,点运算符的运用
  7. Python 函数3000字使用总结
  8. Python3并发编程-多线程threading怎么用?
  9. 问题记录 | SpringMVC整合jackson版本问题
  10. 液晶显示模块的分类和基本知识