后台返回的金额数是字符串NSString,要对其进行计算的话,当时就转成CGFloat,结果发现转后的数值不准确了,解决这个问题需要使用金融货币的API。
//部分创建方法
NSDecimalNumber*FloatDN = [[NSDecimalNumberalloc] initWithFloat:1.0998];//结果是:1.0997999906539917312NSDecimalNumber*IntDN =[[NSDecimalNumberalloc]initWithInt:2];//结果是:2NSDecimalNumber*IntegerDN =[[NSDecimalNumberalloc]initWithInteger:2];//结果是:2NSDecimalNumber*BoolDN =[[NSDecimalNumberalloc]initWithBool:0];//结果是:0NSDecimalNumber*zeroDN = [NSDecimalNumberzero];// 结果是:0NSDecimalNumber*oneDN = [NSDecimalNumberone];// 结果是:1
NSNumber -> NSDecimalNumber(基础类型的话,要先转成NSNumber)
NSDecimalNumber*num2 = [NSDecimalNumberdecimalNumberWithDecimal:[[NSNumbernumberWithInt:123.98] decimalValue]];//结果是:123NSDecimalNumber*num3 = [NSDecimalNumberdecimalNumberWithDecimal:[[NSNumbernumberWithDouble:123.01298] decimalValue]];//结果是:123.01298
NSString -> NSDecimalNumber
NSDecimalNumber*a = [NSDecimalNumberdecimalNumberWithString:@"1.0998"];NSDecimalNumber*b = [NSDecimalNumberdecimalNumberWithString:@"0.9934"];NSDecimalNumber*result1 = [a decimalNumberByAdding:b]; 加NSDecimalNumber*result2 = [a decimalNumberBySubtracting:b]; 减NSDecimalNumber*result3 = [a decimalNumberByMultiplyingBy:b]; 乘NSDecimalNumber*result4 = [a decimalNumberByDividingBy:b]; 除数为0会 crash
NSDecimalNumberHandle
NSRoundPlain 四舍五入
NSRoundDown 只舍不入
NSRoundUp, 只入不舍
NSRoundBankers 四舍六入, 中间值时, 取最近的,保持保留最后一位为偶数
scale: 小数点后保留的位数
/*
NSRoundPlain 四舍五入
NSRoundDown 只舍不入
NSRoundUp, 只入不舍
NSRoundBankers 四舍六入, 中间值时, 取最近的,保持保留最后一位为偶数
初始化方法
@param roundingMode 舍入方式
@param scale 小数点后舍入值的位数
@param exact 精度错误处理
@param overflow 溢出错误处理
@param underflow 下溢错误处理
@param divideByZero 除以0的错误处理
@return NSDecimalNumberHandler对象
*/
NSDecimalNumberHandler *roundUp = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundPlain
scale:2// 小数点后保留的位数
raiseOnExactness:NOraiseOnOverflow: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 = [NSDecimalNumberdecimalNumberWithString:@"0.01"];
NSDecimalNumber*multiplicandNumber = [NSDecimalNumberdecimalNumberWithString:@"9999.01"];
NSDecimalNumber*product = [multiplicandNumber decimalNumberByMultiplyingBy:multiplierNumber];
NSString*productStr = [product stringValue];//转成字符串方便显示(转成字符串的过程中不会出现精度问题,放心)
productStr 就是 @"99.9901"
比较大小
NSDecimalNumber*discount1 = [NSDecimalNumberdecimalNumberWithString:@".85"];
NSDecimalNumber*discount2 = [NSDecimalNumberdecimalNumberWithString:@".9"];
NSComparisonResultresult = [discount1 compare:discount2];
if(result ==NSOrderedAscending) {
NSLog(@"小于");
}elseif(result ==NSOrderedSame) {
NSLog(@"等于");
}elseif(result ==NSOrderedDescending)
NSLog(@"大于");
}
网友评论