iOS 金融數字 (NSDecimalNumber)

 

後臺返回的金額數是字符串NSString,要對其進行計算的話,當時就轉成CGFloat,結果發現轉後的數值不許確了,解決這個問題須要使用金融貨幣的API。服務器

 

//部分建立方法ide

NSDecimalNumber *FloatDN = [[NSDecimalNumber alloc] initWithFloat:1.0998];//結果是:1.0997999906539917312

NSDecimalNumber *IntDN =[[NSDecimalNumber alloc]initWithInt:2];   //結果是:2

NSDecimalNumber *IntegerDN =[[NSDecimalNumber alloc]initWithInteger:2];   //結果是:2

NSDecimalNumber *BoolDN =[[NSDecimalNumber alloc]initWithBool:0];  //結果是:0

NSDecimalNumber *zeroDN = [NSDecimalNumber zero]; // 結果是:0

NSDecimalNumber *oneDN  = [NSDecimalNumber one];  // 結果是:1

 

NSNumber -> NSDecimalNumber(基礎類型的話,要先轉成NSNumber)spa

NSDecimalNumber *num2 = [NSDecimalNumber decimalNumberWithDecimal:[[NSNumber numberWithInt:123.98] decimalValue]]; //結果是:123

NSDecimalNumber *num3 = [NSDecimalNumber decimalNumberWithDecimal:[[NSNumber numberWithDouble:123.01298] decimalValue]];//結果是:123.01298

   

NSString -> NSDecimalNumbercode

NSDecimalNumber *a = [NSDecimalNumber decimalNumberWithString:@"1.0998"];

NSDecimalNumber *b = [NSDecimalNumber decimalNumberWithString:@"0.9934"];

NSDecimalNumber *result1 = [a decimalNumberByAdding:b];   加

NSDecimalNumber *result2 = [a decimalNumberBySubtracting:b]; 減

NSDecimalNumber *result3 = [a decimalNumberByMultiplyingBy:b]; 乘

NSDecimalNumber *result4 = [a decimalNumberByDividingBy:b]; 除數爲0會 crash

 

 

 

NSDecimalNumberHandlerip

    NSRoundPlain    四捨五入ci

    NSRoundDown   只舍不入字符串

    NSRoundUp,      只入不捨string

    NSRoundBankers  四捨六入, 中間值時, 取最近的,保持保留最後一位爲偶數it

    scale: 小數點後保留的位數io

NSDecimalNumberHandler *roundUp = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundPlain scale:2 raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:YES];

NSDecimalNumber *one = [NSDecimalNumber decimalNumberWithString:@"90.7009"];

NSDecimalNumber *two = [NSDecimalNumber decimalNumberWithString:@"0.22"];

   
//1. one + two 不作任何處理

NSDecimalNumber *result1 = [one decimalNumberByAdding:two];

   
//2. one - two 不作任何處理

NSDecimalNumber *result2 = [one decimalNumberBySubtracting:two];


//3. one * two 不作任何處理

NSDecimalNumber *result3 = [one decimalNumberByMultiplyingBy:two];


//4. one + two 結果 四捨五入

NSDecimalNumber *result4 = [one decimalNumberByAdding:two withBehavior:roundUp];


//5.對一個數 進行四捨五入,並保留2位小數的操做

NSDecimalNumber *resultDN = [one decimalNumberByRoundingAccordingToBehavior: roundUp];

  

 

 

 

 

 

 

對於服務器返回可計算的 Float 或者 Double 或者 int,可是計算完後,用什麼接受呢?float? double?這樣精度仍是不精確

float A = 0.01;

float B = 9999.01;

   

float C = A*B;               //咱們平常手動計算結果應該是 99.9901

NSLog(@"CCCCC==%f",C);     //輸出結果爲 99.990097

NSLog(@"CCCCC==%.2f",C);   //保留兩位小數,輸出結果爲 99.99(自動4舍5入)

               明顯不精確了,咱們想要的是99.9901

用上面的方法解決,代碼以下:

NSDecimalNumber *multiplierNumber = [NSDecimalNumber decimalNumberWithString:@"0.01"];

NSDecimalNumber *multiplicandNumber = [NSDecimalNumber decimalNumberWithString:@"9999.01"];

NSDecimalNumber *product = [multiplicandNumber decimalNumberByMultiplyingBy:multiplierNumber];

NSString *productStr =  [product stringValue]; //轉成字符串方便顯示(轉成字符串的過程當中不會出現精度問題,放心)

  productStr 就是  @"99.9901"

   

 

 

比較大小       

NSDecimalNumber *discount1 = [NSDecimalNumber decimalNumberWithString:@".85"];

NSDecimalNumber *discount2 = [NSDecimalNumber decimalNumberWithString:@".9"];

NSComparisonResult result = [discount1 compare:discount2];

   
if (result == NSOrderedAscending) {

       NSLog(@"小於");

} else if (result == NSOrderedSame) {

       NSLog(@"等於");

} else if (result == NSOrderedDescending) {

       NSLog(@"大於");

}
相關文章
相關標籤/搜索