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
相关产品推荐
相关产品推荐

