You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:39:46