我正在使用
的解决方案在Html + Javascript上进行一个quardratic方程求解器
在我的html表单中,我有3个文本框代表a,b,c在ax ^ 2 + bx + = 0,有3个comcobox(选项)用于将a,b,c设置为+或 - 如< / p>
我设法收到符号+, - 通过在更改组合框时触发这些功能
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存在?它不应该因为它是一个简单的数学
答案 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语句中所有重复的代码。