后台返回的金额数是字符串NSString,要对其进行计算的话,当时就转成CGFloat,结果发现转后的数值不准确了,解决这个问题需要使用金融货币的API。
//部分创建方法
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)
NSDecimalNumber *num2 = [NSDecimalNumber decimalNumberWithDecimal:[[NSNumber numberWithInt:123.98] decimalValue]]; //结果是:123
NSDecimalNumber *num3 = [NSDecimalNumber decimalNumberWithDecimal:[[NSNumber numberWithDouble:123.01298] decimalValue]];//结果是:123.01298
NSString -> NSDecimalNumber
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
NSDecimalNumberHandler
NSRoundPlain 四舍五入
NSRoundDown 只舍不入
NSRoundUp, 只入不舍
NSRoundBankers 四舍六入, 中间值时, 取最近的,保持保留最后一位为偶数
scale: 小数点后保留的位数
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(@"大于");
}