文章目录
- 前言
- I、计算器的核心代码
- 1.1 负责计算表达式的工具类
- see also
前言
- 效果图
- 背景
之前使用NSExpression 进行表达式的计算,发现一个问题:无法精准小数点位数(1+65 和65+1 的精度就不一样)
- 解决方案:采用的是NSDecimalNumber 进行计算
NSDecimalNumber
NSDecimalNumber* computeResult = [MSParser parserComputeNumberExpression:floatString error:nil]; NSDecimal decimal = computeResult.decimalValue; NSDecimal desDecimal; NSDecimalRound(&desDecimal, &decimal , 2, NSRoundPlain); result = [[NSDecimalNumber decimalNumberWithDecimal:desDecimal] stringValue];
I、计算器的核心代码
@interface QCTQCTCalculatorViewTableViewCell () /** 负责计算表达式的值 */ @property (strong, nonatomic) CQTMoneyCalculator *moneyCalculator; /** 计算器视图(读者自己实现,后续考虑开源) */ @property (weak, nonatomic) QCTCalculatorView *cellView;
1.1 负责计算表达式的工具类
- moneyCalculator
/** 负责计算表达式的值 */ @property (strong, nonatomic) CQTMoneyCalculator *moneyCalculator;
- 计算表达式
result = [ self.moneyCalculator kn_evaluateExpression:strArr];
- kn_evaluateExpression
- (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; }