美文网首页C---OCios基础知识
NSDecimalNumber - 精确的数值计算

NSDecimalNumber - 精确的数值计算

作者: 居然是村长 | 来源:发表于2016-03-18 21:57 被阅读695次

    浮点数计算会存在误差
    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

    相关文章

      网友评论

        本文标题:NSDecimalNumber - 精确的数值计算

        本文链接:https://www.haomeiwen.com/subject/iihhlttx.html