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

标签 javascript html math

我正在 Html+Javascript 上使用以下解决方案进行二次方程求解器

Quardratic solving equation

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

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

问题来了:任何包含signb==“-”的if、else if给出第一个答案,但正确给出第二个答案

本例:

    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;原始磁盘=0; dis=0;除=2; x1=30; x2=3; x1 如何变成 30?

此外,所有其他 B 符号为“-”的人都在 x1 上给出了错误的答案,没有任何模式,即使所有先前的变量都是正确的!现在我通过将其反射(reflect)到方程的另一边并根据该方程进行计算来修复它

ax^2-bx+c=0 转换为 -ax^2+bx-c=0 这有效。但我只是想知道为什么会出现这个bug?不应该,因为这是一个简单的数学

最佳答案

该问题是由于 JavaScript 的松散类型造成的。它认为 b 是一个字符串,因此当它尝试执行 first+dis 而不是数字相加时,会进行字符串连接 "6"+"0"给出“60”。它足够智能,可以在所有其他操作中转换为数字格式。

为了解决这个问题

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

附:如果你找到 a、b、c 的签名版本,你的代码将会整洁很多

if(signa=="-")
   a = -a;

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

关于Javascript 二次方程求解器 BUG - 需要解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22889852/

相关文章:

javascript - 为什么在使用 reactjs Hook 时会出现 "TypeError: react__WEBPACK_IMPORTED_MODULE_1___default.a.useState is not a function"错误?

javascript - Ajax 调用不同的 Controller

javascript - 我需要在外部脚本和样式表中使用 rel ="nofollow"吗?

java - 初学者基本三角表,增量为 5 度

javascript - 如何在 JavaScript 中指定 Math.log() 的基数?

javascript - SessionStorage 浏览器范围(范围)或 LocalStorage 在退出时删除

HTML 中的 JavaScript 和 SVG

java - 如何使用 Java 解析 Html 并获取字符串形式的结果

css - 如何将一个 div 粘贴到另一个 div 的底部?

javascript - 当球与矩形碰撞时如何改变 Angular ?