Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   погрешности калькулятора (https://javascript.ru/forum/misc/21938-pogreshnosti-kalkulyatora.html)

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

А обязательно так страшно реализовывать? Если очень хочется парсить строку, можешь посмотреть, как это делается здесь. Но, по-моему, проще сделать так:
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

Цитата:

Сообщение от qwertyuiop10
да, парсить обязательно, по твоей ссылке прошел, но не понял ничего

Обязательно разбери материал по ссылке и пойми его.
Цитата:

Сообщение от qwertyuiop10
что-то вроде .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");


Часовой пояс GMT +3, время: 22:34.