插件:js-big-decimal
import bigDecimal from ‘js-big-decimal’
// 四则运算
Vue.prototype.fourOperation = function(expression, floatNum) {
function isOperator(value) {
var operatorString = "+-*/()";
return operatorString.indexOf(value) > -1
}
function getPrioraty(value) {
switch (value) {
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
default:
return 0;
}
}
function prioraty(o1, o2) {
return getPrioraty(o1) <= getPrioraty(o2);
}
function dal2Rpn(exp) {
let reg = RegExp(/\+|\-|\*|\/|\(|(|\)|)/g)
let strSplit = exp.split(reg);
let strMatch = exp.match(reg);
let newStr = []
let a = 0;
for (var i = 0; i < strSplit.length; i++) {
if (strSplit[i]) {
newStr.push(strSplit[i]);
}
if (i != strSplit.length - 1) {
newStr.push(strMatch[i]);
}
}
let newStr1 = []
for (var i = 0; i < newStr.length; i++) {
if (i == 0 && newStr[i] == "-") {
newStr1.push(newStr[i] + newStr[i + 1])
i = i + 1;
} else if (i - 1 >= 0 && newStr[i] == "-" && isNaN(newStr[i - 1])) {
newStr1.push(newStr[i] + newStr[i + 1])
i = i + 1;
} else {
newStr1.push(newStr[i])
}
}
newStr = newStr1;
var inputStack = [];
var outputStack = [];
var outputQueue = [];
for (let i in newStr) {
var cur = newStr[i];
if (cur != ' ') {
inputStack.push(cur);
}
}
while (inputStack.length > 0) {
var cur = inputStack.shift();
if (isOperator(cur)) {
if (cur == '(') {
outputStack.push(cur);
} else if (cur == ')') {
var po = outputStack.pop();
while (po != '(' && outputStack.length > 0) {
outputQueue.push(po);
po = outputStack.pop();
}
if (po != '(') {
throw "error: unmatched ()";
}
} else {
while (prioraty(cur, outputStack[outputStack.length - 1]) && outputStack.length > 0) {
outputQueue.push(outputStack.pop());
}
outputStack.push(cur);
}
} else {
outputQueue.push(cur);
}
}
if (outputStack.length > 0) {
if (outputStack[outputStack.length - 1] == ')' || outputStack[outputStack.length - 1] == '(') {
throw "error: unmatched ()";
}
while (outputStack.length > 0) {
outputQueue.push(outputStack.pop());
}
}
return outputQueue;
}
function evalRPN(tokens) {
let stack = [];
for (let item of tokens) {
switch (item) {
case '+':
let a1 = stack.pop();
let b1 = stack.pop();
stack.push(bigDecimal.add(b1, a1));
break;
case '-':
let a2 = stack.pop();
let b2 = stack.pop();
stack.push(bigDecimal.subtract(b2, a2));
break;
case '*':
let a3 = stack.pop();
let b3 = stack.pop();
stack.push(bigDecimal.multiply(b3, a3));
break;
case '/':
let a4 = stack.pop();
let b4 = stack.pop();
stack.push(bigDecimal.divide(b4, a4, floatNum + 20));
break;
default:
stack.push(parseFloat(item));
}
}
return parseFloat(stack.pop());
}
let expArr = dal2Rpn(expression)
let resultExp = evalRPN(expArr)
return resultExp
}
使用
this.fourOperation(‘11+2233-44/50’,2)
console.log(this.fourOperation('11+2233-44/50’,2)) // 输出:736.12