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

如何在Kotlin中求解字符串形式的数学表达式?

在Kotlin中计算字符串形式的数学表达式

下面是几种实用的实现方式,覆盖不同场景需求:

方法一:利用Java Script引擎(快速实现,无需额外依赖)

JDK自带的ScriptEngine可以调用JavaScript引擎解析计算表达式,适合快速验证简单场景:

import javax.script.ScriptEngineManager

fun evaluateExpression(expr: String): Double {
    val engine = ScriptEngineManager().getEngineByName("JavaScript")
    return engine.eval(expr) as Double
}

// 调用示例
fun main() {
    val example1 = "3+5"
    val example2 = "3*5/3"
    println(evaluateExpression(example1)) // 输出8.0
    println(evaluateExpression(example2)) // 输出5.0
}

注意:这种方式依赖JDK的ScriptEngine实现,Android环境下可能需要额外配置,且对复杂自定义表达式支持有限。

方法二:手动实现表达式解析(适合自定义规则,无依赖)

如果需要完全控制解析逻辑,比如处理特定运算或优先级,可以手动实现简单的表达式解析。下面是支持加减乘除、考虑运算优先级的示例:

fun calculate(expr: String): Double {
    // 按+/-分割表达式,保留运算符
    val parts = expr.split("(?=[+-])".toRegex())
    var result = 0.0
    for (part in parts) {
        // 按*/分割每个加减项,处理乘除优先级
        val subParts = part.split("(?=[*/])".toRegex())
        var subResult = subParts[0].toDouble()
        for (i in 1 until subParts.size) {
            val op = subParts[i][0]
            val num = subParts[i].substring(1).toDouble()
            when (op) {
                '*' -> subResult *= num
                '/' -> subResult /= num
            }
        }
        // 处理加减符号
        if (part.startsWith('-')) {
            result -= subResult
        } else {
            result += subResult
        }
    }
    return result
}

// 调用示例
fun main() {
    println(calculate("3+5")) // 8.0
    println(calculate("3*5/3")) //5.0
    println(calculate("10-3*2+4/2")) // 6.0
}

这个实现先拆分加减项,再逐个处理项内的乘除运算,保证了运算优先级。如果需要支持括号、更复杂运算符,可以扩展为递归下降解析器。

方法三:使用第三方表达式库(适合复杂场景)

如果需要支持括号、数学函数(如sin、log)等复杂特性,可以使用成熟的第三方库,比如Exp4j:

  1. 添加Gradle依赖:
dependencies {
    implementation 'net.objecthunter:exp4j:0.4.8'
}
  1. 代码示例:
import net.objecthunter.exp4j.Expression
import net.objecthunter.exp4j.ExpressionBuilder

fun evaluateComplexExpression(expr: String): Double {
    val expression: Expression = ExpressionBuilder(expr).build()
    return expression.evaluate()
}

// 调用示例
fun main() {
    println(evaluateComplexExpression("3+5*(2-1)")) // 8.0
    println(evaluateComplexExpression("sin(PI/2) + log(10)")) // 2.0
}

该库支持运算符优先级、括号、常用数学函数等,适合复杂表达式计算。

内容的提问来源于stack exchange,提问作者Latte

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 07:55:27