表达式求值并处理精度问题
起因是公司项目中需要用到公式计算,直接使用的 eval 进行处理,精度问题无可避免。在安装了皮佬的 babel-plugin-arithmetic 插件后,依然没有得到解决,原因是执行 eval 函数并不会走 babel 编译。
要做的事情
function formula(params) {}
formula(`0.1 + 0.2`) // 0.3
实现一个函数,输入字符串公式,返回的结果,且无精度问题。
实现
function formula(list) {
const result = calc(list, 0, list.length - 1)
console.log(`计算的结果值等于${result}`)
}
function calc(s, l, r) {
let op = -1,
pri = 1000 - 1,
cur_pri,
temp = 0,
i = l
while (i <= r) {
cur_pri = 1000
switch (s[i]) {
case '+':
case '-':
cur_pri = 1 + temp
break
case '*':
case '/':
cur_pri = 2 + temp
break
case '(':
temp += 100
break
case ')':
temp -= 100
break
}
if (cur_pri <= pri) {
pri = cur_pri
op = i
}
i++
}
if (op === -1) {
let num = 0
const val = s.slice(l, r + 1).trim()
if (/^[+-]?(0|([1-9]\d*))(\.\d+)?$/.test(val)) {
return parseFloat(val)
}
for (let i = l; i <= r; i++) {
if (s[i] < '0' || s[i] > '9') continue
num = num * 10 + (s[i] - '0')
}
return num
}
const a = calc(s, l, op - 1)
const b = calc(s, op + 1, r)
switch (s[op]) {
case '+':
return accAdd(a, b)
case '-':
return accSub(a, b)
case '*':
return accMul(a, b)
case '/':
return accDiv(a, b)
}
return 0
}
最后计算的四个函数直接拿了 babel-plugin-arithmetic 中的源码,程序员拷代码的事能叫抄吗?