1

我有一个 javascript / jquery 代码,它从用户那里接受一个公式和数字并求解方程。我在 jquery 中的代码可以得到实数的解决方案,但是以字符串的形式,我无法让 javascript 以数学方式求解方程。

我有类似的东西

1000 * (200+3928)/2333

但是,这些数字都是字符串格式,并且将它们中的每一个强制转换为浮点数或整数并重新插入它们只会将它们转换回字符串。尝试使用 valueOf 和其他东西,但没有任何效果。有没有更好的方法或我缺少的东西?

谢谢

4

4 回答 4

1

你会发现这一点parseInt()并且parseFloat()很有帮助。请务必包含您的基数,以便正确解析值。

var first = "1000", // String
    secnd = "25.2", // String
    third = parseInt(first, 10) * parseFloat(secnd); // Number

如果您想简洁,以牺牲一些可读性为代价,您还可以使用+运算符将​​字符串转换为数字:

+"23"; // 23
+"2.3"; // 2.3

演示:http: //jsfiddle.net/bj74v/1/

于 2012-11-29T03:29:34.357 回答
1

当你有一个字符串形式的简单方程时,最实用的方法是将字符串解析为prefixpostfix符号,然后对其进行相应的评估......

假设原始字符串是infix(人类用来学习基本数学的符号),例如......

1000 * (200+3928)/2333

然后,您将其转换postfix为获得...

1000, 200, 3928, +, *, 2333, /

使用这种表示法,计算机可以使用简单的循环和堆栈轻松评估表达式......

我不会发布实际代码,因为我想把有趣的部分留给你,但如果你想用伪代码先行一步,这里就...

infix to postfix :

  create empty array `postfix` and `temp`

  split the expression up into an array `A` by each operand/operator

  foreach token in `A`:
    if char is operand :
      push to postfix stack
    if char is open parenthesis:
      push to temp stack
    if char is close parenthesis:
      while top of temp stack != '(' :
        push top of temp stack to postfix stack
        pop top of temp stack
      end while
      pop top of temp stack
    if char is operator:
      while temp stack isn't empty *and* top of temp stack != '(' *and* precendence(char) <= precendence(top of temp stack) :
        push top of temp stack to postfix stack
        pop top of temp stack
      end while
      push char to temp stack

  end for loop

  while temp stack is not empty
    push top of temp stack to postfix stack
    pop top of temp stack
  end while

  return postfix stack (will be your postfix stack to evaluate)



evaluate postfix stack:
  create array A
  foreach token in postfix stack:
    if char is operand:
      push to A stack
    if char is operator:
      int x = pop A stack
      int y = pop A stack
      result = x (operation) y
      push result to A stack
  end for loop

  return top of A stack (this will be the final result)
于 2012-11-29T04:08:34.527 回答
0

如果你想制作一个自由形式的计算器,你有两个选择。您可以使用eval()直接计算结果,就像 elclanrs 说的那样。但随后用户可以输入任意 Javascript 代码,因此不建议这样做。您的第二个选项是创建表达式解析器和评估器。如果你想处理括号之类的东西,这并不难,但也不是微不足道的。这是我通过搜索“javascript 算术解析器”找到的一个示例: http ://code.google.com/p/js-equation-parser/ 。它是开源的,所以如果您想了解它是如何完成的,请查看代码。

于 2012-11-29T03:36:33.033 回答
-1

您的意思是用户实际键入1000 * (200+3928)/2333还是从不同输入中获取的数字并存储在变量中然后计算结果?

如果是第一种情况,那么您可以使用eval

eval('1000 * (200+3928)/2333')

如果是第二种情况,您可以将 a+添加到您的字符串中,从而将其转换为如下数字:

var num = +'1000'
于 2012-11-29T03:31:27.413 回答