之前使用NSExpression 进行表达式的计算,发现一个问题:无法精准小数点位数(1+65 和65+1 的精度就不一样)
NSDecimalNumber
NSDecimalNumber* computeResult = [MSParser parserComputeNumberExpression:floatString error:nil];
NSDecimal decimal = computeResult.decimalValue;
NSDecimal desDecimal;
NSDecimalRound(&desDecimal, &decimal , 2, NSRoundPlain);
result = [[NSDecimalNumber decimalNumberWithDecimal:desDecimal] stringValue];
@interface QCTQCTCalculatorViewTableViewCell ()
/**
负责计算表达式的值
*/
@property (strong, nonatomic) CQTMoneyCalculator *moneyCalculator;
/**
计算器视图(读者自己实现,后续考虑开源)
*/
@property (weak, nonatomic) QCTCalculatorView *cellView;
/**
负责计算表达式的值
*/
@property (strong, nonatomic) CQTMoneyCalculator *moneyCalculator;
result = [ self.moneyCalculator kn_evaluateExpression:strArr];
- (NSString *)kn_evaluateExpression:(NSString *)expressionString {
if (expressionString.length<=0) {
return nil;
}
// 处理非法的表达式:最后一个字符是 -/*.+ 其中的一种就return 去掉;目的是去除运算符
if ([@".+-÷/*×x" containsString:[expressionString substringFromIndex:expressionString.length-1]]) {//÷
// 写一个递归计算
NSString *tmp = [expressionString substringToIndex:expressionString.length-1];
// NSString *tmp = [expressionString substr
return [self kn_evaluateExpression: tmp];
}
NSString *sanitizedString = [self sanitizedString:expressionString];
NSString *floatString = [NSString stringWithFormat:@"1.0*%@", sanitizedString];//1.0*1+1+9/8
NSString * result = nil;
NSDecimalNumber* computeResult = [MSParser parserComputeNumberExpression:floatString error:nil];
NSDecimal decimal = computeResult.decimalValue;
NSDecimal desDecimal;
NSDecimalRound(&desDecimal, &decimal , 2, NSRoundPlain);
result = [[NSDecimalNumber decimalNumberWithDecimal:desDecimal] stringValue];
NSLog(@"保留2位小数计算结果为:%@",result);
return result;
}