Javascript二次方程求解器BUG - 需要解释

时间:2014-04-06 04:04:36

标签: javascript html math

我正在使用

的解决方案在Html + Javascript上进行一个quardratic方程求解器

Quardratic solving equation

在我的html表单中,我有3个文本框代表a,b,c在ax ^ 2 + bx + = 0,有3个comcobox(选项)用于将a,b,c设置为+或 - 如< / p>

enter image description here

我设法收到符号+, - 通过在更改组合框时触发这些功能

  function changeasign()
    {
       signa=document.getElementById("signa").value;
    }
  function changebsign()
    {
       signb=document.getElementById("signb").value;
    }
  function changecsign()
    {
       signc=document.getElementById("signc").value;
    }

然后按下按钮时,此功能称为

   function cal()
     {
       var a = document.getElementById("a").value;
       if(a=="")
       {
         a=1;
       }
       var b = document.getElementById("b").value;
       if(b=="")
       {
         b=1;   
       }
       var c = document.getElementById("c").value;
       if(c=="")
       {
         c=0;
       }
       var first;
       var rawdis;
       var dis;
       var divide;
       var x1;
       var x2;
       if(signa=="+" && signb=="+" && signc=="+")// +,+,+
       {
         first=-b;
         rawdis=Math.pow(b,2)-4*a*c;
         if(rawdis<0)
         {
           document.getElementById("ans").innerHTML = "This equation doesn't have realnumber as answers";
           return;
         }
         dis=Math.sqrt(rawdis);
         divide=2*a;
         x1=(first+dis)/divide;
         x2=(first-dis)/divide;
         document.getElementById("ans").innerHTML = "X="+x1+","+x2;
         }
       else if(signa=="+" && signb=="+" && signc=="-")
       {
    //Loops through +,+,-   +,-,+   +,-,-

这个工作正常,如果输入+ 1x ^ 2 + 2x + 1,它将返回X = -1,-1

问题来自:任何if,否则如果包含signb ==“ - ”给出第一个答案,但正确给出第二个答案

Thiscase:

    else if(signa=="+" && signb=="-" && signc=="+")
      {
        first=b;
        rawdis=Math.pow(b,2)-4*a*c;
        if(rawdis<0)
        {
          document.getElementById("ans").innerHTML = "This equation doesn't have realnumber as answers";
          return;
        }
         dis=Math.sqrt(rawdis);
         divide=2*a;
         x1=(first+dis)/divide;
         x2=(first-dis)/divide;
         document.getElementById("ans").innerHTML = "X="+x1+","+x2;
      }

输入:+ x ^ 2-6x + 9输出:X = 30,3正确答案:X = 3,3

当我将其设置为显示所有变量时输出:first = 6; rawdis = 0; DIS = 0;分= 2; X1 = 30; X2 = 3; x1如何变成30?

另外所有其他B标志为“ - ”的人都会在x1上给出错误的答案,没有任何模式,即使所有以前的变量都是正确的!现在我通过将其反映到方程的另一侧来计算并计算出该方程式

ax ^ 2-bx + c = 0进-ax ^ 2 + bx-c = 0这有效。但我只是想知道为什么这个bug存在?它不应该因为它是一个简单的数学

1 个答案:

答案 0 :(得分:2)

问题是由于javascript的松散输入造成的。它认为b是一个字符串,因此当它尝试first+dis而不是数字添加时,字符串连接"6"+"0"会给"60"。它足够聪明,可以在所有其他操作中转换为数字格式。

要解决此问题

a = parseFloat(a);
b = parseFloat(b);
c = parseFloat(c);

P.S。如果你找到a,b,c

的签名版本,你的代码会更加整洁
if(signa=="-")
   a = -a;

这样你可以消除if语句中所有重复的代码。