Вход

Просмотр полной версии : погрешности калькулятора


qwertyuiop10
30.09.2011, 00:03
<html>
<head>
</head>
<body>
<script language="javascript">
str="5*8/3*6/10";
ss1=str.split(/\+|\-|\*|\//);
ss2=str.split(/0|1|2|3|4|5|6|7|8|9/);
//строка, числовой массив и массив действий

//------функции---
function clear(){
ss4=[];
ss3=[];

j=0;
for(i=0;i<ss1.length;i++){
if(ss1[i]!=""){
ss4[j++]=ss1[i];
}}
ss1=ss4;

j=0;
for(i=0;i<ss2.length;i++){
if(ss2[i]!=""){
ss3[j++]=ss2[i];
}}
ss2=ss3;}
//-----------чистка массивов------------
clear();
//-----------делим---------------------------
for(i=0;i<ss2.length;i++){
if(ss2[i]=="/"){
ss1[i]=ss1[i]/ss1[i+1];
ss1[i]=Math.round(ss1[i]*100000)/100000;
ss1[i+1]='';
ss2[i]='';
clear();
i=0;
alert("Строка: "+str+"\nМассив числел: "+ss1+"\nМассив дейсивий: "+ss2+"\n");
}}
for(i=0;i<ss2.length;i++){
if(ss2[i]=="/"){
ss1[i]=ss1[i]/ss1[i+1];
ss1[i]=Math.round(ss1[i]*100000)/100000;
ss1[i+1]='';
ss2[i]='';
clear();
i=0;
alert("Строка: "+str+"\nМассив числел: "+ss1+"\nМассив дейсивий: "+ss2+"\n");
}}


//--------------------------------------
for(i=0;i<ss2.length;i++){
if(ss2[i]=="*"){
ss1[i]=ss1[i]*ss1[i+1];
ss1[i+1]='';
ss2[i]='';
clear();
i=0;
alert("Строка: "+str+"\nМассив числел: "+ss1+"\nМассив дейсивий: "+ss2+"\n");
}}
for(i=0;i<ss2.length;i++){
if(ss2[i]=="*"){
ss1[i]=ss1[i]*ss1[i+1];
ss1[i+1]='';
ss2[i]='';
clear();
i=0;
alert("Строка: "+str+"\nМассив числел: "+ss1+"\nМассив дейсивий: "+ss2+"\n");
}}
document.getElementsByTagName("body")[0].innerHTML=document.getElementsByTagName("body")[0].innerHTML+"Строка: "+str+"<br>Массив числел: "+ss1+"<br>Массив дейсивий: "+ss2+"<br>";
</script>
</body>
</html>

это калькулятор (часть кода убрал, оставил * и /), смысл в том, что он разбирает готовую строку (str) на подстроки чисел и действий, и считает. проблема при .../3*6... при этом всплывают погрешности, пытался убрать округлив, не получилось, конечно лучше сначала умножать, потом делить, но это намного сложнее, так как скрипт умножает соседние числа и получится .../18... что делать? как убрать погрешности?
пс. циклы дважды поставил, потому, что последнее действие не выполнялось, долго искал ошибку, не нашёл и оставил так покашто.

Sweet
30.09.2011, 01:14
А обязательно так страшно реализовывать? Если очень хочется парсить строку, можешь посмотреть, как это делается здесь (https://github.com/DmitrySoshnikov/Essentials-of-interpretation/tree/master/src). Но, по-моему, проще сделать так:function evaluate(expression){
try {
return + Function( "return " + expression )();
} catch(error) {
return NaN;
};
};

alert( evaluate( "5*8/3*6/10" ) );

qwertyuiop10
30.09.2011, 01:44
Sweet,
да, парсить обязательно, по твоей ссылке прошел, но не понял ничего, завтра буду думать. ещё небольшой вопрос: как в .replace() закинуть в порвое значение элем. массива? что-то вроде .replace(bb[8],"blabla")?

Sweet
30.09.2011, 11:34
да, парсить обязательно, по твоей ссылке прошел, но не понял ничего
Обязательно разбери материал по ссылке и пойми его.что-то вроде .replace(bb[8],"blabla")?
Такой код является рабочим.

qwertyuiop10
30.09.2011, 14:34
Sweet,
нет нужен глоб. поиск, вроде /bb[1]/g чтобы произошла замена всех найденных bb[1].

qwertyuiop10
02.10.2011, 23:08
x=RegExp(bb[i],"g");
y=y.replace(x,"bebe");