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

Kotlin开发Android计算器如何实现log与ln对数计算功能

exp4j计算器log/ln功能报错解决方案

根因说明

  • exp4j 0.4.8版本默认没有内置ln函数,默认的log()函数计算的是自然对数,内置的常用对数(以10为底)函数为log10(),和大众使用的log代表常用对数、ln代表自然对数的习惯不匹配。
  • 未手动注册自定义的ln、log函数时,exp4j会把未识别的函数名当成未赋值的变量,转换Double失败就会抛出invalid Double错误。
  • 对数函数入参≤0、表达式拼接错误(如缺括号、参数含非数字字符)也会触发该报错。

修复步骤

2.1 注册自定义对数函数

在MainActivity.kt的表达式计算逻辑中,初始化阶段注册适配使用习惯的自定义对数函数,无需修改依赖配置:

import net.objecthunter.exp4j.ExpressionBuilder
import net.objecthunter.exp4j.function.Function

// 该段代码放在Activity的onCreate方法中,全局仅需注册一次
val lnFunction = object : Function("ln", 1) {
    override fun apply(vararg args: Double): Double {
        if (args[0] <= 0) throw IllegalArgumentException("对数参数必须大于0")
        // 自然对数取kotlin.math.ln
        return kotlin.math.ln(args[0])
    }
}

val logFunction = object : Function("log", 1) {
    override fun apply(vararg args: Double): Double {
        if (args[0] <= 0) throw IllegalArgumentException("对数参数必须大于0")
        // 常用对数取kotlin.math.log10,覆盖exp4j默认的log实现
        return kotlin.math.log10(args[0])
    }
}

2.2 构造表达式时传入自定义函数

每次构造计算表达式时,把上面注册的两个函数传入ExpressionBuilder:

// inputStr为你从输入框获取的表达式字符串
val calculationResult = try {
    ExpressionBuilder(inputStr)
        .function(lnFunction)
        .function(logFunction)
        .build()
        .evaluate()
} catch (e: Exception) {
    // 捕获错误统一提示,避免崩溃
    "输入无效"
}
// 后续把calculationResult设置到结果显示控件即可

2.3 补充输入校验

在触发计算前先做前置校验,避免无效输入:

  • 检查所有log()、ln()的括号内是否为空、是否包含非数字字符
  • 提前校验对数参数是否大于0,不符合要求直接提示用户,不进入计算逻辑
  • 点击对数按钮输入时,自动补全括号和默认有效值,比如直接输出log(100),减少用户输入错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 06:09:05