Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Не корректно работает формула при выводе (https://javascript.ru/forum/misc/84856-ne-korrektno-rabotaet-formula-pri-vyvode.html)

Behemoth911 17.01.2023 12:37

Не корректно работает формула при выводе
 
При проверке результата выдаёт 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))}`;
}

рони 17.01.2023 12:38

Behemoth911,
Пожалуйста, отформатируйте свой код!

Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[html run]
... минимальный код страницы с вашей проблемой
[/html]

О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.

рони 17.01.2023 12:40

Behemoth911,
строки преобразуйте в числа +form

рони 17.01.2023 12:49

Behemoth911,
Цитата:

Сообщение от Behemoth911
должно выйти в итоге 7.27

??? 7.28 выходит
<!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 17.01.2023 12:51

Сейчас проверю)

Behemoth911 17.01.2023 12:54

Да, ошибку свою понял) Если можно буду ещё к вам обращаться?) :)

рони 17.01.2023 13:09

Behemoth911,
да)))

Behemoth911 17.01.2023 14:54

рони, Спасибо) Ещё вопрос (сразу скажу, что я пока разбираюсь в JS, но знаю что мне надо написать в итоге)) - можно ли (допустим) если есть 5 формул подряд - 1 просто считается (как эта, что Вы помогли), вторая тоже, а вот в третью мне надо уже чтобы оно брало вводные с результатов 1 и 2й формулы? https://ibb.co/RDbwwr7

рони 17.01.2023 15:09

Behemoth911,
функция должна что-то возвращать и тогда будет что-то типа
function breakWay3() { ...
return  result}
function breakWay4() { ...
return  result}
function breakWay5() {
return breakWay3() * breakWay5() };
let x = breakWay5();


Возврат значения

Behemoth911 17.01.2023 15:15

рони,

я просто тут чуть другим путем пошёл - неверным(

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й формуле, как-то так

рони 17.01.2023 15:31

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);
*/!*
        }

рони 17.01.2023 15:53

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>

Behemoth911 17.01.2023 16:08

рони, так а там же в 11 строке, перед исправлением уже .toFixed(2) есть? или так проще типа?

result.innerText = `Результат: ${Number(resultF4.toFixed(2))}`;

Behemoth911 17.01.2023 16:08

рони, а, понял, оно с return - возвращает

Behemoth911 18.01.2023 15:17

рони, добрый день, получилось-таки домучить формулы вчера)
https://ibb.co/jrtw2GM

теперь думаю как бы это дело автоматизировать, а то надо нажимать результат вручную каждый раз последовательно

рони 18.01.2023 15:35

Цитата:

Сообщение от Behemoth911
а то надо нажимать результат вручную каждый раз последовательно

вопрос зачем нажимать несколько раз, если нужен конечный результат. как это сделать вам уже было показано, но пока вам сложно это понять.
и лучше код, чем картинки))) а код и картинка, ещё лучше)))

Behemoth911 18.01.2023 15:45

рони, та я пока учусь то новые знание полезны, мне друг советовал типы данных 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>

рони 18.01.2023 15:52

Behemoth911,
дерзайте)))

Behemoth911 18.01.2023 15:55

ещё вопрос (далеко наперёд) - есть какая-то программа чтобы потом интегрировать html, js и стили туда? Чтоб через .exe файл работало с внутренностями этими

рони 18.01.2023 17:05

Цитата:

Сообщение от Behemoth911
html, js и стили туда? Чтоб через .exe файл

https://qna.habr.com/q/889199

Behemoth911 18.01.2023 17:36

рони, спасибо) попробуем)

Behemoth911 19.01.2023 22:11

рони, добрый вечер) подскажите пожалуйста: а можно 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]

Behemoth911 19.01.2023 22:37

Остальные разновидности J я думал потом удалить и всё.. Их просто много будет, а каждый раз копировать в HTML то код будет очень длинный.. Та и практичней так будет если бы J был глобальный

рони 19.01.2023 22:56

Behemoth911,
разбейте функции на две.

1. функция должна вычислять результат и возвращать его
2. запрашивать результат у первой и выводить куда - то.

и тогда вы забьёте на глобальные переменные, как ненужные.

рони 19.01.2023 23:11

Behemoth911,
function getGlobal() {
            return Number(document.querySelector('#JGlobal').value)
        }
        let J = getGlobal();

        document.querySelector('#JGlobal').addEventListener('change', function() {
            J = getGlobal();
        })

Behemoth911 20.01.2023 10:02

рони, спасибо ОГРОМНОЕ, помогло) вчера сидел на developer.mozilla и читал про .addEventListener как раз, и там примері по кликам мышки и тд. Теперь и t3 смогу так вывести) Самое удобное в этой штуке то, что можно оставить в функции (где надо отдельно) тоже J и оно будет работать)

Behemoth911 20.01.2023 15:36

рони, решил я из формул этих удалить J и оставить глобальный, теперь формулы не работают просто(

просто удалял, как выше было в html коде..:

<div>J
            <select id="J2">
                <option>6.3</option>
                <option>6.8</option>
             <option>7.0</option>
            </select>
        </div>


... и всьо, теперь не работает( Не пойму в чём проблема если оно глобально теперь J берёт

рони 20.01.2023 16:50

Behemoth911,
пас ... читать учебник, структурировать код, делать его понятным.

Behemoth911 20.01.2023 17:18

пока (временно) решил проблему: <div hidden> J </div> , но правильное решение попытаюсь найти

рони 20.01.2023 17:39

Behemoth911,
правильное решение: нужны данные, запустили функцию, получили результат. не надо из одной функции делать универсального солдата.
Что такое чистые функции в JavaScript?

Behemoth911 20.01.2023 18:34

рони, очень полезная информация, спасибо)
Ну тут просто есть значения, которые я хотел выбирать только раз для ряда формул) Это намного удобнее как оказалось, я так сделал с J и t3 уже и стало намного легче

Behemoth911 21.01.2023 16:16

рони, нашёл в чëм была проблема - я когда убирал J из html то забывал в формах в js менять цифры привязки в скобках [ ]:

const vaf = +form[4].value

В таких местах) Банально забыл из-за невнимательности (

Behemoth911 31.01.2023 12:51

рони, добрый день, такой вопрос, точнее проблема - написал формулы по расчётам, рассчитывает всё сверху-вниз по иерархии, и тут столкнулся с проблемой: у меня выводят данные в таблицу только при значениях первых двух расчётов. Ка мне сделать чтобы таблица запоминала первые два расчёта, а остальные два добавляла в таблицу тоже ниже них? φ выбирал сразу 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);
}

рони 31.01.2023 13:09

Behemoth911,
не могу помочь.

Behemoth911 31.01.2023 13:15

рони, хорошо, спасибо


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