後臺返回的金額數是字符串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(@"大於"); }