Не корректно работает формула при выводе
При проверке результата выдаёт NaN :( , помогите решить проблему.
Сама формула в WebCalc 2.0 выглядит так: Sтд=Sю+Va×T3/7.2-L-C 9.3+38.5*0.25/7.2-2.52-0.838 (должно выйти в итоге 7.27) Код HTML: <h1>Визначення Sтд</h1> <form id="formInput3"> <div>T3 <select id="T33"> <option>0.25</option> <option>0.4</option> <option>0.6</option> </select> </div> <div> <label>Sj</label> <input type="number"> </div> <div> <label>va</label> <input type="number"> </div> <div> <label>L</label> <input type="number"> </div> <div> <label>C</label> <input type="number"> </div> </form> <button onclick="breakWay3()">Результат Sтд</button> <h2 id="resultF4"></h2> Код JS: function breakWay3() { const form = document.querySelector('#formInput3'); const Sj = form[1].value; const va = form[2].value; const L = form[3].value; const C = form[4].value; const t3 = Number(document.querySelector('#T33').value); let resultF4 = Sj + va * t3 / 7.2 - L - C; console.log(+resultF4.toFixed(2)); const result = document.querySelector('#resultF4'); result.innerText = `Результат: ${Number(resultF4.toFixed(2))}`; } |
Behemoth911,
Пожалуйста, отформатируйте свой код! Для этого его можно заключить в специальные теги: js/css/html и т.п., например: [html run] ... минимальный код страницы с вашей проблемой [/html] О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting. |
Behemoth911,
строки преобразуйте в числа +form |
Behemoth911,
Цитата:
<!DOCTYPE html> <html> <head> <title>Untitled</title> <meta charset="utf-8"> <style type="text/css"> </style> </head> <body> <h1>Визначення Sтд</h1> <form id="formInput3"> <div>T3 <select id="T33"> <option selected="selected">0.25</option> <option>0.4</option> <option>0.6</option> </select> </div> <div> <label>Sj</label> <input type="number" value="9.3"> </div> <div> <label>va</label> <input type="number" value="38.5"> </div> <div> <label>L</label> <input type="number" value="2.52"> </div> <div> <label>C</label> <input type="number" value="0.838"> </div> </form> <button onclick="breakWay3()">Результат Sтд</button> <h2 id="resultF4"></h2> <script> function breakWay3() { const form = document.querySelector('#formInput3'); const Sj = +form[1].value; const va = +form[2].value; const L = +form[3].value; const C = +form[4].value; const t3 = Number(document.querySelector('#T33').value); resultF4 = Sj + va * t3 / 7.2 - L - C; console.log(+resultF4.toFixed(2)); const result = document.querySelector('#resultF4'); result.innerText = `Результат: ${Number(resultF4.toFixed(2))}`; } </script> </body> </html> |
Сейчас проверю)
|
Да, ошибку свою понял) Если можно буду ещё к вам обращаться?) :)
|
Behemoth911,
да))) |
рони, Спасибо) Ещё вопрос (сразу скажу, что я пока разбираюсь в JS, но знаю что мне надо написать в итоге)) - можно ли (допустим) если есть 5 формул подряд - 1 просто считается (как эта, что Вы помогли), вторая тоже, а вот в третью мне надо уже чтобы оно брало вводные с результатов 1 и 2й формулы? https://ibb.co/RDbwwr7
|
Behemoth911,
функция должна что-то возвращать и тогда будет что-то типа function breakWay3() { ... return result} function breakWay4() { ... return result} function breakWay5() { return breakWay3() * breakWay5() }; let x = breakWay5(); Возврат значения |
рони,
я просто тут чуть другим путем пошёл - неверным( resultF3 - из 1 формулы посщитаной resultF4 - 2 формулы посщитаной function breakWay4() { const form = document.querySelector('#formInput4'); console.log(form); const t3 = Number(document.querySelector('#T3').value); const J = Number(document.querySelector('#J4').value); resultF5 = resultF3 - (Math.sqrt(resultF3 ** 2 - ( 2 * resultF4 ) / J + (t3 * t3) / 4)); console.log(+resultF5.toFixed(4)); const result = document.querySelector('#resultF5'); result.innerText = `Результат2: ${Number(resultF5.toFixed(4))}`; } и ещё надо чтоб результаты оно отобразило перед тем тех ещё формул и учло их в 3й формуле, как-то так |
Behemoth911,
пока добавить нечего, но на всякий случай ... function breakWay3() { const form = document.querySelector('#formInput3'); const Sj = +form[1].value; const va = +form[2].value; const L = +form[3].value; const C = +form[4].value; const t3 = Number(document.querySelector('#T33').value); resultF4 = Sj + va * t3 / 7.2 - L - C; console.log(+resultF4.toFixed(2)); const result = document.querySelector('#resultF4'); result.innerText = `Результат: ${Number(resultF4.toFixed(2))}`; *!* return +resultF4.toFixed(2); */!* } |
Behemoth911,
ещё для медитации ... <!DOCTYPE html> <html> <head> <title>Untitled</title> <meta charset="utf-8"> <style type="text/css"> </style> </head> <body> <h1>Визначення Sтд</h1> <form id="formInput3"> <div>T3 <select id="T33" name="t3"> <option selected="selected">0.25</option> <option>0.4</option> <option>0.6</option> </select> </div> <div> <label>Sj</label> <input type="number" value="9.3" name="Sj"> </div> <div> <label>va</label> <input type="number" value="38.5" name="va"> </div> <div> <label>L</label> <input type="number" value="2.52" name="L"> </div> <div> <label>C</label> <input type="number" value="0.838" name="C"> </div> </form> <button onclick="make3()">Результат Sтд</button> <h2 id="resultF4"></h2> <script> function breakWay3() { const form = document.querySelector('#formInput3'); const [Sj, va, L, C, t3] = ['Sj', 'va', 'L', 'C', 't3'].map(a => +form[a].value); const result = Sj + va * t3 / 7.2 - L - C; return +result.toFixed(2) } function make3() { const result = breakWay3(); const div = document.querySelector('#resultF4'); div.innerText = `Результат: ${result}`; } </script> </body> </html> |
рони, так а там же в 11 строке, перед исправлением уже .toFixed(2) есть? или так проще типа?
result.innerText = `Результат: ${Number(resultF4.toFixed(2))}`; |
рони, а, понял, оно с return - возвращает
|
рони, добрый день, получилось-таки домучить формулы вчера)
https://ibb.co/jrtw2GM теперь думаю как бы это дело автоматизировать, а то надо нажимать результат вручную каждый раз последовательно |
Цитата:
и лучше код, чем картинки))) а код и картинка, ещё лучше))) |
рони, та я пока учусь то новые знание полезны, мне друг советовал типы данных JS почитать) Но эту штуку я хотел просто автоматизировать по максимуму (это очень важно будет) :) Это просто была одна из самых длинных цепочек формул) Таких формул по 1-2-3 шт будет ещё приличное количество). Вчера сам сел разобрался как из 2 формул одну собрать удобную:
<h1>Кут покриття</h1> <form id="formInput7"> <div> <label>h</label> <input type="number"> </div> <button onclick="breakWay6()">Результат</button> <h2 id="resultF7"></h2> </form> <script> let resultF7 function breakWay6() { const form = document.querySelector('#formInput7'); const h = +form[0].value; resultF7 = ((Math.atan(h / 100)) / (Math.PI / 180)); console.log(+resultF7.toFixed(3)); const result = document.querySelector('#resultF7'); result.innerText = `Результат tg: ${Number(resultF7.toFixed(3))}`; } </script> |
Behemoth911,
дерзайте))) |
ещё вопрос (далеко наперёд) - есть какая-то программа чтобы потом интегрировать html, js и стили туда? Чтоб через .exe файл работало с внутренностями этими
|
Цитата:
|
рони, спасибо) попробуем)
|
рони, добрый вечер) подскажите пожалуйста: а можно J глобально вынести для всех формул? Чтобы раз выбрал и оно само присваивали его во всех функциях где оно необходимо? Просто в J там будет клацалка с вариантами выбора, и было бы намного проще выбирать её один раз только.
<h1>J gl</h1> <form> <div>J <select id="JGlobal"> <option>6.8</option> <option>6.9</option> <option>7.0</option> <option>7.5</option> <option>3.9</option> <option>5.9</option> </select> </div> </form> <h1>So</h1> <form id="formInput"> <div>J <select id="J"> <option>6.8</option> <option>7.0</option> </select> </div> <div>T1 <select id="T1"> <option>0.6</option> <option>0.8</option> <option>1</option> <option>1.2</option> <option>1.4</option> </select> </div> <div>T2 <select id="T2"> <option>0.2</option> <option>0.4</option> <option>0.6</option> </select> </div> <div> <label>T3</label> <input type="number"> </div> <div> <label>Va</label> <input type="number"> </div> </form> <button onclick="breakWay()">Результат So</button> <h2 id="result"></h2> <h1>Vад (по видимості)</h1> <form id="formInput1"> <div>J <select id="J2"> <option>6.3</option> <option>6.8</option> <option>7.0</option> </select> </div> <div>T2 <select id="T21"> <option>0.2</option> <option>0.4</option> <option>0.6</option> </select> </div> <div> <label>T3</label> <input type="number"> </div> <div> <label>sv</label> <input type="number"> </div> <div> <label>vaf</label> <input type="number"> </div> </form> <button onclick="breakWay1()">Результат Vад</button> <h2 id="result2"></h2> <h2 id="result3"></h2> </div> [js run] let resultF1; let resultF2; let J = Number(document.querySelector('#JGlobal').value); function breakWay() { const form = document.querySelector('#formInput'); const t3 = form[3].value; const va = form[4].value; const t1 = Number(document.querySelector('#T1').value); const t2 = Number(document.querySelector('#T2').value); //const J = Number(document.querySelector('#J').value); resultF1 = (t1 + t2 + Number(t3 * 0.5)) * (+va / 3.6) + (Math.pow(+va, 2) / (25.92 * J)); console.log(+resultF1.toFixed(2)); const result = document.querySelector('#result'); result.innerText = `Результат: ${Number(resultF1.toFixed(2))}`; } function breakWay1() { const form = document.querySelector('#formInput1'); console.log(form); const t3 = +form[2].value; const sv = +form[3].value; const vaf = +form[4].value; const t2 = Number(document.querySelector('#T21').value); //const J = Number(document.querySelector('#J2').value); resultF2 = 3.6 * J * (0.3 + t2 + 0.5 * t3) * ((Math.sqrt((2 * sv) / (J * (Math.pow(+ (0.3 + t2 + 0.5 * t3), 2))) + 1)) - 1); console.log(+resultF2.toFixed(2)); const result = document.querySelector('#result2'); result.innerText = `Результат2: ${Number(resultF2.toFixed(2))}`; const div = document.getElementById("result3"); if (resultF2 > vaf) { div.innerText = 'Швидкість руху перевищує фактичну' } else { div.innerText = 'Швидкість руху не перевищує фактичну' } } [/js] |
Остальные разновидности J я думал потом удалить и всё.. Их просто много будет, а каждый раз копировать в HTML то код будет очень длинный.. Та и практичней так будет если бы J был глобальный
|
Behemoth911,
разбейте функции на две. 1. функция должна вычислять результат и возвращать его 2. запрашивать результат у первой и выводить куда - то. и тогда вы забьёте на глобальные переменные, как ненужные. |
Behemoth911,
function getGlobal() { return Number(document.querySelector('#JGlobal').value) } let J = getGlobal(); document.querySelector('#JGlobal').addEventListener('change', function() { J = getGlobal(); }) |
рони, спасибо ОГРОМНОЕ, помогло) вчера сидел на developer.mozilla и читал про .addEventListener как раз, и там примері по кликам мышки и тд. Теперь и t3 смогу так вывести) Самое удобное в этой штуке то, что можно оставить в функции (где надо отдельно) тоже J и оно будет работать)
|
рони, решил я из формул этих удалить J и оставить глобальный, теперь формулы не работают просто(
просто удалял, как выше было в html коде..: <div>J <select id="J2"> <option>6.3</option> <option>6.8</option> <option>7.0</option> </select> </div> ... и всьо, теперь не работает( Не пойму в чём проблема если оно глобально теперь J берёт |
Behemoth911,
пас ... читать учебник, структурировать код, делать его понятным. |
пока (временно) решил проблему: <div hidden> J </div> , но правильное решение попытаюсь найти
|
Behemoth911,
правильное решение: нужны данные, запустили функцию, получили результат. не надо из одной функции делать универсального солдата. Что такое чистые функции в JavaScript? |
рони, очень полезная информация, спасибо)
Ну тут просто есть значения, которые я хотел выбирать только раз для ряда формул) Это намного удобнее как оказалось, я так сделал с J и t3 уже и стало намного легче |
рони, нашёл в чëм была проблема - я когда убирал J из html то забывал в формах в js менять цифры привязки в скобках [ ]:
const vaf = +form[4].value В таких местах) Банально забыл из-за невнимательности ( |
рони, добрый день, такой вопрос, точнее проблема - написал формулы по расчётам, рассчитывает всё сверху-вниз по иерархии, и тут столкнулся с проблемой: у меня выводят данные в таблицу только при значениях первых двух расчётов. Ка мне сделать чтобы таблица запоминала первые два расчёта, а остальные два добавляла в таблицу тоже ниже них? φ выбирал сразу 0.4, потом 0.6, верхние данные записал уже в форму.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Заокруглення</title> </head> <body> <h1>Гранична швидкість на заокругленні дороги</h1> <form id="formInput2"> <div> <label>h</label> <input type="number" value="0.12"> </div> <div> <label>S</label> <input type="number" value="10"> </div> </form> <button onclick="breakWay2()">Результат Rцт</button> <h2 id="resultF3"></h2> <div id="global-Fi"></div> <button onclick="breakWay3()">Результат φ` (0.8)</button> <h2 id="resultF41"></h2> <button onclick="breakWay4()">Результат φ` (0.9)</button> <h2 id="resultF51"></h2> <button onclick="breakWay5()">Результат Vцт (0.8)</button> <h2 id="resultF61"></h2> <button onclick="breakWay6()">Результат Vцт (0.9)</button> <h2 id="resultF71"></h2> <table border="1"> <caption>Таблиця</caption> <tr> <th>Номер варіанту</th> <th>φ`</th> <th>Vцт, км/год</th> </tr> <tr><td>1</td><td><h2 id="resultF4"></h2></td><td><h2 id="resultF6"></h2></td></tr> <tr><td>2</td><td><h2 id="resultF5"></h2></td><td><h2 id="resultF7"></h2></td></tr> <tr><td>3</td><td>фи' (0.9*фи с таблицы 0.6) </td><td>результат фи' (0.4) * Rцт </td></tr> <tr><td>4</td><td>фи' (0.9*фи с таблицы 0.6)</td><td>результат фи' (0.4) * Rцт</td></tr> </table> </body> </html> function addGlobalFiTemplate() { const FiTemplate = ` <form> <label> φ: <select> <optgroup label="Асфальтобетон, бетон, φ = 0.4...0.6"> <option value="0.4">0.4 Мокрий</option> <option value="0.6">0.6 Мокрий</option> </select> </label> </form>`; const FiContainer = document.querySelector('#global-Fi'); if (FiContainer) { FiContainer.innerHTML = FiTemplate; FiContainer.addEventListener('change', function (event) { Fi = Number(event.target.value); }) } } let resultRct; let resultVct; let resultVct1; let resultFi1; addGlobalFiTemplate(); //Заокруглення // R_цт=(S^2+4×h^2)/(8×h) //(10^2+4*0.12^2)/(8*0.12) function breakWay2() { const form = document.querySelector('#formInput2'); const h = +form[0].value; const S = +form[1].value; resultRct = ((S ** 2) + (4 * (h ** 2))) / (8 * h) ; console.log(+resultRct.toFixed(2)); const result = document.querySelector('#resultF3'); result.innerText = ` ${Number(resultRct.toFixed(2))}`; return +resultRct.toFixed(2); } function breakWay3() { resultFi1 = 0.8 * Fi; console.log(+resultFi1.toFixed(2)); const result = document.querySelector('#resultF4'); result.innerText = ` ${Number(resultFi1.toFixed(2))}`; return +resultFi1.toFixed(2); } function breakWay4() { resultFi1 = 0.9 * Fi; console.log(+resultFi1.toFixed(2)); const result = document.querySelector('#resultF5'); result.innerText = ` ${Number(resultFi1.toFixed(2))}`; return +resultFi1.toFixed(2); } function breakWay5() { resultVct = Math.sqrt(127 * resultRct * resultFi1) ; console.log(+resultVct.toFixed(1)); const result = document.querySelector('#resultF6'); result.innerText = ` ${Number(resultVct.toFixed(1))}`; return +resultVct.toFixed(1); } function breakWay6() { resultVct1 = Math.sqrt(127 * resultRct * resultFi1) ; console.log(+resultVct1.toFixed(1)); const result = document.querySelector('#resultF7'); result.innerText = ` ${Number(resultVct1.toFixed(1))}`; return +resultVct1.toFixed(1); } |
Behemoth911,
не могу помочь. |
рони, хорошо, спасибо
|
Часовой пояс GMT +3, время: 20:30. |