NSDecimalNumber - 精确的数值计算

浮点数计算会存在误差
float:6-7位有效数
double:15-16位有效数
decimal:不是基础数据类型,精确度非常高具体也不是很了解,一般用作货币计算时使用。精度高对应的消耗也大。

创建 NSDecimalNumber

[NSDecimalNumber zero] // 0
[NSDecimalNumber one] // 1
[NSDecimalNumber minimumDecimalNumber] // 超级小
[NSDecimalNumber maximumDecimalNumber] // 超级大
[NSDecimalNumber notANumber] // NaN

// 字符串 获取
[NSDecimalNumber decimalNumberWithString:@"a111.111aa'11.11"] // 只获取一个小数点,或者 NaN

// NSNumber 获取
NSNumber *number1 = @12.456789;
NSDecimal decimal = [number1 decimalValue];
NSDecimalNumber *decimal2 = [[NSDecimalNumber alloc] initWithDecimal:decimal];
    


计算

注意计算要直接使用下面的方法,不要先转换成double 或者其他计算。

    NSDecimalNumber *add = [decimal1 decimalNumberByAdding:decimal2];// 加
    NSDecimalNumber *substract = [decimal1 decimalNumberBySubtracting:decimal2];// 减
    NSDecimalNumber *multiply = [decimal1 decimalNumberByMultiplyingBy:decimal2];// 乘
    NSDecimalNumber *divid = [decimal1 decimalNumberByDividingBy:decimal2];// 除
    NSDecimalNumber *rais = [decimal1 decimalNumberByRaisingToPower:3];// decimal1 的 power次方
    NSDecimalNumber *multiplyPower10 = [decimal1 decimalNumberByMultiplyingByPowerOf10:3];// decimal1 乘 10 的 power次方

调整有效位数

    // 有效数调整:scale:小数位数。 其他参数:都是异常处理 YES 返回异常! NO 忽略
    NSDecimalNumberHandler *hander = [[NSDecimalNumberHandler alloc] initWithRoundingMode:NSRoundPlain
                                                                                    scale:2
                                                                         raiseOnExactness:NO
                                                                          raiseOnOverflow:NO
                                                                         raiseOnUnderflow:NO
                                                                      raiseOnDivideByZero:YES];

// 例如 计算是就处理
    NSDecimalNumber *aaaa = [decimal1 decimalNumberByMultiplyingBy:decimal2 withBehavior:hander];

// 或者 直接处理
    NSDecimalNumber *decimal3 = [decimal1 decimalNumberByRoundingAccordingToBehavior:hander];

转换

    NSDecimal newDecimal = [decimal1 decimalValue];
    NSString *newString = [decimal1 stringValue];
    double newDouble = [decimal1 doubleValue];

NSDecimal 类

其他

1

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容