您的位置:首页 > 移动开发 > IOS开发

iOS 笔记 精确计算 NSDecimalNumber

2016-07-12 16:28 501 查看
今天因为出现了 str 转float 的误差问题, 接触到了NSDecimalNumber这个类, 在别人那里找来了一些现成的笔记, 记录一下  

/**由于NSDecimalNumber能够存储很大的值(大到38位 x
10^+/-128)。这样进行一些大数值运算时也很方便,但是直接使用C的标量值会比通过NSDecimalNumber更快,所以需要慎重选择该方法。通常来说,这只在集合中使用。
     */
  
    //NSDecimalNumber常见用法
    //1.小数位处理及约数方式
    NSDecimalNumberHandler * roundUp = [NSDecimalNumberHandlerdecimalNumberHandlerWithRoundingMode:NSRoundBankersscale:2raiseOnExactness:NOraiseOnOverflow:NOraiseOnUnderflow:NOraiseOnDivideByZero:YES]; //保留两位小数(scale)
    /** RoundingMode:NSRoundPlain //貌似取整
        NSRoundDown, // Always down == truncate //只舍不入
        NSRoundUp, // Always up    // 只入不舍
        NSRoundBankers  // on a tie round so last digit is even  //貌似四舍五入
     **/
    NSDecimalNumber *subtotal = [NSDecimalNumberdecimalNumberWithString:@"90.7049"];
    NSDecimalNumber *discount = [NSDecimalNumberdecimalNumberWithString:@"0.22"];
    NSDecimalNumber *total = [subtotaldecimalNumberByAdding:discount withBehavior:roundUp];
    //按照roundUp规定好的进行相加:四舍五入、保留两位小数
    NSLog(@"Rounded total: %@", total);
    
    //2.次方计算
    NSDecimalNumber*price;
    price = [NSDecimalNumberdecimalNumberWithMantissa:1599exponent:-2  //10的-2次方
                    isNegative:NO];
    //等效于
    price = [NSDecimalNumberdecimalNumberWithString:@"15.99"];
   
    //3.加减乘除四则运算
    NSDecimalNumber*price1 = [NSDecimalNumberdecimalNumberWithString:@"15.99"];
    
    NSDecimalNumber*price2 = [NSDecimalNumberdecimalNumberWithString:@"29.99"];
    
    NSDecimalNumber*coupon = [NSDecimalNumberdecimalNumberWithString:@"5.00"];
    
    NSDecimalNumber*disCount = [NSDecimalNumberdecimalNumberWithString:@".90"];
    
    NSDecimalNumber*numProducts = [NSDecimalNumberdecimalNumberWithString:@"2.0"];
    
    NSDecimalNumber *subTotal = [price1decimalNumberByAdding:price2];//相加
    
    NSDecimalNumber *afterCoupon = [subtotaldecimalNumberBySubtracting:coupon];//相减
    
    NSDecimalNumber *afterDiscount = [afterCoupondecimalNumberByMultiplyingBy:disCount];//相乘
    //按照roundUp规定好的进行相乘:四舍五入、保留两位小数
    NSDecimalNumber*total2 = [subtotaldecimalNumberByMultiplyingBy:discountwithBehavior:roundUp];
    
    NSDecimalNumber *average = [afterDiscountdecimalNumberByDividingBy:numProducts];//相除
    
    NSDecimalNumber*averageSquared = [averagedecimalNumberByRaisingToPower:2];//平方
    
    
    //4.比较大小
    NSDecimalNumber*discount1 = [NSDecimalNumberdecimalNumberWithString:@".85"];
    
    NSDecimalNumber*discount2 = [NSDecimalNumberdecimalNumberWithString:@".9"];
    
    NSComparisonResult result = [discount1compare:discount2];
    
    if (result ==NSOrderedAscending) {
        
        NSLog(@"85%% < 90%%小于");
        
    } elseif (result == NSOrderedSame)
{
        
        NSLog(@"85%% == 90%%等于");
        
    } elseif (result == NSOrderedDescending)
{
        
        NSLog(@"85%% > 90%%大于");
        
    }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: