需求
平时我们进行数值计算时,使用常用的数据类型进行加减乘除是不会有什么问题的,但是一旦涉及精度高的,特别是计算金额时,就特别容易踩坑,本人就经历过两次,回想起来血淋淋的场面依然历历在目。
苹果其实很早就推出过计算高精度类型的API。只不过我没发现。感觉自己还是too young too simple
。话不多说,直奔主题。
本文转载至天狐博客
NSDecimalNumber
NSDecimalNumber,不可变NSNumber 的子类,提供了一个面向对象的十进制运算包装器 。实例可以代表任意数值,表示为(mantissa)尾数x 10 ^(exponent)指数,(mantissa)尾数是一个十进制整数到38位长,(exponent)指数是一个整数从-128年到127。
参数名 | 意义 |
---|---|
Mantissa | 十进制整数 |
Exponent | 小数位数 |
Flag(Sign) | 是否为负数 |
创建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,如下例所示。
|
|
+ (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划分的部分数的有效组成部分。
|
|
以下是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
加上decimalNumber给接受者并返回一个新创建的NSDecimalNumber对象。
behavior:指定的如何处理计算错误和舍入行为。
减法运算
- (NSDecimalNumber )decimalNumberBySubtracting:(NSDecimalNumber )decimalNumber
返回一个新的NSDecimalNumber对象,其值是调用者减去另一个给定NSDecimalNumber对象的值。
- (NSDecimalNumber )decimalNumberBySubtracting:(NSDecimalNumber )decimalNumber withBehavior:(id
返回一个新的NSDecimalNumber对象,其值是调用者减去另一个给定NSDecimalNumber对象的值。
behavior:指定的如何处理计算错误和舍入行为。
乘法运算
- (NSDecimalNumber )decimalNumberByMultiplyingBy:(NSDecimalNumber )decimalNumber
返回一个新的NSDecimalNumber对象,其值是调用者乘以另一个给定NSDecimalNumber对象的值。
- (NSDecimalNumber )decimalNumberByMultiplyingBy:(NSDecimalNumber )decimalNumber withBehavior:(nullable id
返回一个新的NSDecimalNumber对象,其值是调用者乘以另一个给定NSDecimalNumber对象的值。
behavior:指定的如何处理计算错误和舍入行为。
除法运算
- (NSDecimalNumber )decimalNumberByDividingBy:(NSDecimalNumber )decimalNumber
返回一个新的NSDecimalNumber对象,其值是调用者除以另一个给定NSDecimalNumber对象的值。
- (NSDecimalNumber )decimalNumberByDividingBy:(NSDecimalNumber )decimalNumber withBehavior:(nullable id
返回一个新的NSDecimalNumber对象,其值是调用者除以另一个给定NSDecimalNumber对象的值。
behavior:指定的如何处理计算错误和舍入行为。
a的N次方
- (NSDecimalNumber *)decimalNumberByRaisingToPower:(NSUInteger)power
返回一个新的NSDecimalNumber对象,其值是调用者 的power次方。
- (NSDecimalNumber *)decimalNumberByRaisingToPower:(NSUInteger)power withBehavior:(nullable id
返回一个新的NSDecimalNumber对象,其值是调用者 的power次方。
behavior:指定的如何处理计算错误和舍入行为。
指数运算
- (NSDecimalNumber *)decimalNumberByMultiplyingByPowerOf10:(short)power
返回一个新的NSDecimalNumber对象,其值是调用者乘以10的power次方。
- (NSDecimalNumber *)decimalNumberByMultiplyingByPowerOf10:(short)power withBehavior:(nullable id
返回一个新的NSDecimalNumber对象,其值是调用者乘以10的power次方。
behavior:指定的如何处理计算错误和舍入行为。
四舍五入
- (NSDecimalNumber *)decimalNumberByRoundingAccordingToBehavior:(nullable id
返回一个新的NSDecimalNumber对象,其值是调用者四舍五入过后的值。
behavior:指定的如何处理计算错误和舍入行为。
|
|
描述不同的舍入方式,查看NSDecimalNumberBehaviors协议规范的roundingMode方法。
roundingMode四舍五入策略
|
|
访问值
@property(readonly) NSDecimal decimalValue
十进制数最近似的double值。(只读)
- (NSString *)descriptionWithLocale:(id)locale
根据给定的locale返回number的字符串
@property(readonly) const char *objCType
Objective- C的C字符串类型的数据,包含小数对象。(只读)
管理 Behavior
+ (id
返回的算术的方法、像decimalNumberByAdding:四舍五入和处理错误的条件。默认情况下,算术方法使用NSRoundPlain行为;也就是说,四舍五入最可能的返回值的方法。方法假定你需要精度不超过38个有效数字,当他们试图除以0或产生一个数表示太大或太小的时候发生异常。
如果这种默认行为不适合您的应用程序,您应该使用这个方法,让您可以指定行为,像decimalNumberByAdding:withBehavior:。如果你发现自己一直使用一个特定的行为,您可以指定一个不同的默认行为setDefaultBehavior:。
在你的应用程序中默认行为是单独为每个线程维护。
比较 Decimal Numbers
- (NSComparisonResult)compare:(NSNumber *)decimalNumber
返回一个NSComparisonResult值表明调用者和另一个给定的数字NSDecimalNumber对象的顺序大小。
NSOrderedAscending 如果decimalNumber的价值大于调用者;
NSOrderedSame 如果它们相等;
NSOrderedDescending 如果decimalNumber小于调用者的值。
|
|
获取 最大最小可能值
+ (NSDecimalNumber *)maximumDecimalNumber
返回一个NSDecimalNumber对象的最大可能值。
+ (NSDecimalNumber *)minimumDecimalNumber
返回一个NSDecimalNumber对象的最小可能值。
常量 Constants
NSDecimalNumber 异常名称
列出了各种异常的名字 表明NSDecimalNumber计算错误。
|
|
再一次感谢您花费时间阅读这篇文章!
微博: @Danny_吕昌辉
博客: SuperDanny