Выразить/решить формулу с помощью Javascript

Я пытаюсь создать довольно простую форму, которая позволит вводить переменные и решать заданную формулу. Я спотыкаюсь о том, как выразить формулу и как сделать первые две переменные понятыми как показатель степени.

Вот полная формула, которая работает в Excel (метки ячеек заменены входными именами для html):

=varNk * varQr * ( 273 + varT ) / ( 273 + varTo ) * varPp / varP * varKq * varKak

Обратите внимание, что «varNk» и «varQr» — это значения, введенные с показателями степени, т. е. 97,53^12.

РЕДАКТИРОВАТЬ: Фактическая формула (ссылка на изображение, так как у меня недостаточно представителей для прямой публикации) - http://mattk.net/DwFormula1.PNG

Вот что я пытался заставить работать. Я не был уверен, как правильно собрать окончательный результат, но в идеале я хочу выяснить, как сделать это с помощью одной кнопки.

<head>
   <script>
      function doCalcOne()
      {
      var varNk = document.getElementById('varNk').value;    
      var varQr = document.getElementById('varQr').value;   
      var varT = document.getElementById('varT').value;
      var varTo = document.getElementById('varTo').value;
      var varPo = document.getElementById('varPo').value;
      var varP = document.getElementById('varP').value;
      var varKq = document.getElementById('varKq').value;
      var varKak = document.getElementById('varKak').value;

      var result1 = document.getElementById('stepOne');
      var stepOne = varNk * varQr;
      result1.value = stepOne;

      }
      function doCalcTwo()
      {
      var result2 = document.getElementById('stepTwo');
      var stepTwo = parseInt(varT.value) + 273;
      result2.value = stepTwo;
      }
   </script>
</head>
<html>
   <table>
      <tr>
         <td>Step One:<input id="stepOne" /></td>
      </tr>
      <tr>
         <td>Step Two:<input id="stepTwo" /></td>
      </tr>
   </table>
   <div id="DoseRateCalc">
      <p>Enter the values below to calculate the Dose Rate</p>
   </div>
   <table style="width:600px;border:1px solid #000;">
      <tr>
         <td>
            <p>Nk=<input id="varNk" type="text"></p>
         </td>
         <td>
            <p>TN 34013 IC Cal Certificate Detection Calibration Factor</p>
         </td>
      <tr>
         <td>
            <p>Qr=<input id="varQr" type="text"></p>
         </td>
         <td>
            <p>Unidos measured charge in pC (pico coulumb)@20mm</p>
         </td>
      </tr>
      <tr>
         <td>
            <p>T=<input id="varT" type="text"></p>
         </td>
         <td>
            <P>Current temperature</p>
         </td>
      </tr>
      <tr>
         <td>
            <p>To=<input id="varTo" type="text"></p>
         </td>
         <td>
            <p>TN34013 IC cal certificate protocol temp</p>
         </td>
      </tr>
      <tr>
         <td>
            <p>Po=<input id="varPo" type="text"></p>
         </td>
         <td>
            <p>Current pressure</p>
         </td>
      </tr>
      <tr>
         <td>
            <p>P=<input id="varP" type="text"></p>
         </td>
         <td>
            <p>TN34013 IC cal certificate protocol pressure</p>
         </td>
      </tr>
      <tr>
         <td>
            <p>Kq=<input id="varKq" type="text"></p>
         </td>
         <td>
            <p>TN34013 IC cal certificate protocol TW30 Beam Quality Correction value</p>
         </td>
      </tr>
      <tr>
         <td>
            <p>Kak->DW=<input id="varKak" type="text">
         </td>
         <td>
            <p>Correction factor TN 34013 IC  from PTW. Air Kerma --> absorbed dose to water convertion for TW30 Water Phantom Manual pg43</p>
         </td>
      </tr>
      </p>
      <p><input type="button" value="Calculate Step 1" onClick="doCalcOne()"></p>
      <p><input type="button" value="Calculate Step 2" onClick="doCalcTwo()"></p>
   </table>
   <br>    
</html>

РЕДАКТИРОВАТЬ 2: Рабочая функция:

    function doCalcOne()
{
    var varNk = document.getElementById('varNk').value;    
    var varQr = document.getElementById('varQr').value;   
    var varT = document.getElementById('varT').value;
    var varTo = document.getElementById('varTo').value;
    var varPo = document.getElementById('varPo').value;
    var varP = document.getElementById('varP').value;
    var varKq = document.getElementById('varKq').value;
    var varKak = document.getElementById('varKak').value;

    var result1 = document.getElementById('stepOne');
    var stepOne = varNk * (Math.pow(10,9)) * varQr * (Math.pow(10,-12)) * ( 273 + varT ) / ( 273 + varTo ) * varPo / varP * varKq * varKak;

    num = stepOne;
    result1.value = num.toPrecision(4);
}

person mkrueger    schedule 26.06.2014    source источник


Ответы (1)


Вызовите функцию doCalcTwo в конце doCalcOne, передав любые необходимые вам переменные, и вы получите то, что ожидаете! Вы также можете уничтожить вторую кнопку, которая у вас есть. Вот обновленный код:

Обновление: я сделал все это одной функцией и добавил, как мне кажется, правильную математику. Я понятия не имею, что вы на самом деле пытаетесь вычислить, но математика в стиле Excel может быть переведена в JavaScript почти один к одному. Порядок действий зависит от вас!

function doCalcOne()
{
    var varNk = document.getElementById('varNk').value;    
    var varQr = document.getElementById('varQr').value;   
    var varT = document.getElementById('varT').value;
    var varTo = document.getElementById('varTo').value;
    var varPo = document.getElementById('varPo').value;
    var varP = document.getElementById('varP').value;
    var varKq = document.getElementById('varKq').value;
    var varKak = document.getElementById('varKak').value;

    var result1 = document.getElementById('stepOne');
    var stepOne = varNk * varQr * ( 273 + varT ) / ( 273 + varTo ) * varPp / varP * varKq * varKak;

    result1.value = stepOne;
}

Честно говоря, вам здесь не нужны две функции, но я предполагаю, что у вас есть/были причины разбить их таким образом. Просто знайте, что вы определенно можете объединить эти функции в одну, и это должно работать.

Еще один момент, который я хотел бы отметить, заключается в том, что переменные, которые вы создаете внутри одной функции, не будут доступны для другой функции. Это называется «область действия», и ее легко определить, посмотрев на открывающие/закрывающие фигурные скобки ({ and }). Плохо отформатированный код значительно усложняет отслеживание;).

person The Maniac    schedule 26.06.2014
comment
Вау, я очень ценю ваш быстрый ответ и время, чтобы разобраться в этом беспорядке! Я все еще немного не понимаю, как я могу создать все это под одной функцией? С моим окончательным значением, которое должно представлять '= varNk * varQr * ( 273 + varT ) / ( 273 + varTo ) * varPp / varP * varKq * varKak' и как заставить первые две переменные принимать формат 23 ^ 12 (чисто пример). Прошу прощения, что не сразу это понял. - person mkrueger; 26.06.2014
comment
Нет проблем, и для создания показателей степени в JavaScript вы используете функцию pow. Если вам нужно взять основание и показатель степени в качестве переменных, вам придется либо проанализировать текст 23 ^ 12 (сложно, но не так сложно), либо просто предоставить два поля ввода, одно для основания и одно для показателя степени . - person The Maniac; 26.06.2014
comment
Кроме того, я думаю, что математика изначально была неправильной, и это был ваш вопрос! Я обновлю свой ответ! - person The Maniac; 26.06.2014
comment
Ааа, кажется, я начинаю понимать! Кроме того, два числа, которые необходимо ввести с показателем степени, показатель степени является постоянным. Nk = x^9 (или x*10[9]) и Qr = y^-12 (или y*10[-12]). Я пытаюсь написать это так: var a = Math.pow(varNk, 9); var b = Math.pow(varQr, -12); Затем измените формулу на - a * b * ( 273 + varT ) / ( 273 + varTo ) * varPo / varP * varKq * varKak; - person mkrueger; 26.06.2014
comment
Благодаря вашему руководству я смог заставить это работать. Я успешно вычислил показатель степени для каждой переменной и ограничил вывод четырьмя знаками после запятой. Математика верна, теперь я могу использовать ее в качестве руководства для оставшихся шагов моих расчетов. Спасибо еще раз!!!! - person mkrueger; 26.06.2014