gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 17:32:58 25 4
gpt4 key购买 nike

我正在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com