Swift计算器应用中NSExpression求值除法返回整数结果问题求助
解决Swift中NSExpression整数除法返回整数结果的问题
嘿,这个问题我之前做计算器项目时也踩过坑!问题出在NSExpression的运算规则上:当你传入的表达式里的操作数都是整数(比如"3/2"里的3和2),它会执行整数除法——直接舍弃小数部分,所以计算结果是1,再转成Double就变成了1.0,这就是和你预期不符的原因。
给你两个实用的解决思路:
思路1:自动转换整数为浮点数(最简便)
通过正则表达式,把表达式里所有的纯整数替换成带.0的浮点数形式,让NSExpression执行浮点除法。修改后的函数如下:
func mathsSolver(item: String) -> String { // 用正则匹配所有纯整数,替换为x.0的格式 let formattedExpression = item.replacingOccurrences( of: "\\d+", with: "$0.0", options: .regularExpression ) guard let result = NSExpression(format: formattedExpression) .expressionValue(with: nil, context: nil) as? Double else { return "计算错误" } return "\(result)" }
测试一下:
print(mathsSolver(item: "3/2")) // 输出1.5 print(mathsSolver(item: "5/2")) // 输出2.5 print(mathsSolver(item: "4.0/2")) // 已有小数,不受影响,输出2.0
思路2:手动指定运算类型(更灵活)
如果你不想修改原表达式,可以手动构造NSExpression的操作数,强制将整数转为NSNumber的浮点类型。不过这个方法需要解析表达式的各个部分,实现起来相对复杂,适合需要更精细控制运算的场景。比如针对简单除法的实现:
// 示例:手动处理两数除法(复杂混合运算需扩展逻辑) func mathsSolver(item: String) -> String { let components = item.components(separatedBy: "/") guard components.count == 2, let num1 = Double(components[0]), let num2 = Double(components[1]), num2 != 0 else { return "计算错误" } let result = num1 / num2 return "\(result)" }
这个方法适合简单运算,但如果你的计算器支持多运算符混合(比如"3+2*5"),还是思路1更通用。
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

