在JavaScript中解决一个算术字符串?

3
假设我有以下代码:
    var str = "4*(3)^2/1"

最简单的解决方案是将操作符制成一个栈,然后使用后缀表达式进行计算吗?还是我漏掉了一个真正基本的解决方案。

此外,如果我使用对数、自然对数、正弦、余弦和正切,我该如何适应呢?

3个回答

5

很抱歉回复自己的问题,但最简单的解决方案是使用math.js

    var ans = math.eval(str);

2
答案应该包含解决方案。这只是建议使用库来解决问题。可以展示如何使用库,而不仅仅是链接到它。 - Patrick Evans

4

最简单但有点危险,因此在运算之前您可能需要验证(清理)表达式,使用eval(对于指数运算符^,请将其替换为JavaScript中的指数运算符 ** ):

var str="4*(3)^2/1".replace(/\^/g,'**');
console.log(eval(str));

对于像sincosexp等特殊函数,可以使用JavaScript中相应的预定义函数创建自己的函数:

var str="4*(3)^2/1+(exp(5)*cos(14)^(1/sin(13)))^2".replace(/\^/g,'**');
function sin(x) { return Math.sin(x) }
function cos(x) { return Math.cos(x) }
// so on
function exp(x) { return Math.exp(x) }
console.log(eval(str));


3
^是什么意思? - Déjà vu
@ringø,我编辑了答案,你只需要将 ^ 替换为 **,因为后者表示指数运算。 - DjaouadNM

2

您不需要使用后缀表示法。您可以使用eval方法。

var str = "4*(3)^2/1";
console.log(str);
console.log(eval(str));

此外,另一种解决方案是使用javascript-expression-evaluator,它允许您执行以下操作:
Parser.evaluate("2 ^ x", { x: 4 });

1
非常小心地传递参数。如果表达式来自客户端,请确保正确地进行清理。 - Pac0
4
OP可能将 ^2 视为平方,而不是 XOR 2 - Déjà vu
那我应该使用 Math.pow() 吗? - Jamie Alizadeh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接