Результат расчета всегда "NaN"

let z = document.getElementById('id_z')
let x = document.getElementById('id_x')
let y = document.getElementById('id_y')


$("#id_a, #id_b, #id_c, #id_d, #id_e").keyup(function () {
    let a = $('#id_a').val()
    let b = $('#id_b').val()
    let c = $('#id_c').val()
    let d = $('#id_d').val()
    let e = $('#id_e').val()
    
    z.value = ((c * 3.175) / a).toFixed(0)
    x.value = (b*e)+(d*(e - 1))+15
    
    // y variable throws the error
    y.value = ((c*3.175) - (a * z))/z
   
});
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<label>Value A:</label>
<input type = "number" class = "numberinput form-control" required = "" id = "id_a">

<label>Value B:</label>
<input type = "number" class = "numberinput form-control" required = "" id = "id_b">

<label>Value C:</label>
<input type = "number" class = "numberinput form-control" required = "" id = "id_c">

<label>Value D:</label>
<input type = "number" class = "numberinput form-control" required = "" id = "id_d">

<label>Value E:</label>
<input type = "number" class = "numberinput form-control" required = "" id = "id_e">

<div>
<label>Value Z:</label>
<input type = "number" class = "numberinput form-control" required = "" id = "id_z">

<label>Value x:</label>
<input type = "number" class = "numberinput form-control" required = "" id = "id_x">

<label>Value Y:</label>
<input type = "number" class = "numberinput form-control" required = "" id = "id_y">
</div>

Я создаю процесс расчета с использованием JavaScript на основе того, что пользователь вводит, и получаю результат. Когда я пытаюсь ввести число в «шестерню», в консоли отображается ошибка «Указанное значение не может быть проанализировано или находится вне допустимого диапазона».

const z = document.getElementById('id_z')
const x = document.getElementById('id_x')
const y = document.getElementById('id_y')


$("#id_c, #id_d, #id_e, #id_a, #id_b").keyup(function () {
    const a = $('#id_a').val()
    const b = $('#id_b').val()
    const c = $('#id_c').val()
    const d = $('#id_d').val()
    const e = $('#id_e').val()
    
    z.value = ((c * 3.175) / a).toFixed(0)
    x.value = (a*e)+(d*(e - 1)+15)
    
    // y variable throws the error
    y = ((c*3.175) - (a * z))/z
    
    console.info(y)
    console.info(typeof(y))
});

Для z и x все выглядит нормально, но результат вычисления для X всегда выдает NaN. Мне нужен совет по этой проблеме, спасибо.

.val() дает вам строковые значения, а не числа. Вы еще не можете выполнять с ними арифметические операции, сначала превратите их в числа (используя parseFloat, а не parseInt). Тот факт, что z и x работают, по сути, случайность.
Mike 'Pomax' Kamermans 15.02.2023 05:45

Ваш код должен быть ошибочным, вы создали const y, а затем попытались переназначить его другому типу???? 😔 Попробуйте создать [runnable snippets] вместо того, чтобы просто публиковать код. Это, безусловно, улучшит качество вашего вопроса и повысит вероятность того, что другие захотят помочь.

Ruan Mendes 15.02.2023 05:54

Как и просил @RuanMendes, предоставьте минимальный воспроизводимый пример в качестве исполняемого фрагмента. На этот вопрос можно было бы окончательно ответить 20 минут назад.

Robby Cornelissen 15.02.2023 06:12

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

Ruan Mendes 15.02.2023 06:19
((c*3.175) - (a * z))/z -> ((c*3.175) - (a * z.value))/z.value или иным образом не используйте элемент, который является z в математических вычислениях, но его значение. Предполагая, что это вход.
VLAZ 15.02.2023 06:41

Здравствуйте, я уже добавляю исполняемый фрагмент, чтобы прояснить мой вопрос.

Mr Bim 15.02.2023 08:50

Как отмечалось выше, каково значение z в ..(a * z))/z? z = document.getElementById — z — это узел DOM, вы делите его на узел DOM? Это не номер...

freedomn-m 15.02.2023 09:05
Руководство для начинающих по веб-разработке на React.js
Руководство для начинающих по веб-разработке на React.js
Веб-разработка - это захватывающая и постоянно меняющаяся область, которая постоянно развивается благодаря новым технологиям и тенденциям. Одним из...
Калькулятор CGPA 12 для семестра
Калькулятор CGPA 12 для семестра
Чтобы запустить этот код и рассчитать CGPA, необходимо сохранить код как HTML-файл, а затем открыть его в веб-браузере. Для этого выполните следующие...
Как собрать/развернуть часть вашего приложения Angular
Как собрать/развернуть часть вашего приложения Angular
Вам когда-нибудь требовалось собрать/развернуть только часть вашего приложения Angular или, возможно, скрыть некоторые маршруты в определенных средах?
Оптимизация React Context шаг за шагом в 4 примерах
Оптимизация React Context шаг за шагом в 4 примерах
При использовании компонентов React в сочетании с Context вы можете оптимизировать рендеринг, обернув ваш компонент React в React.memo сразу после...
Интервьюер: Почему &apos;[] instanceof Object&apos; возвращает &quot;true&quot;?
Интервьюер: Почему '[] instanceof Object' возвращает "true"?
Все мы знаем, что [] instanceof Array возвращает true, но почему [] instanceof Object тоже возвращает true?
Абстрактное синтаксическое дерево (AST) и как оно работает с ReactJS
Абстрактное синтаксическое дерево (AST) и как оно работает с ReactJS
Абстрактное синтаксическое дерево (AST) - это древовидная структура данных, которая представляет структуру и иерархию исходного кода на языке...
1
7
116
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

А) .val() предоставляет значение в строковом формате, поэтому вам нужно преобразовать его в числа. Так что используйте parseFloat.

Б) Вместо использования константы используйте var или let, поскольку постоянное значение не может изменяться каждый раз при изменении различных входных значений.

C) Поскольку x,y,z являются элементами DOM, вы не можете использовать их напрямую в своих вычислениях. Вам нужно изменить свой код, как показано ниже.

Рабочий фрагмент:

var z = document.getElementById('id_z')
var x = document.getElementById('id_x')
var y = document.getElementById('id_y')

$("#id_c, #id_d, #id_e, #id_a, #id_b").keyup(function() {
  var a = parseFloat($('#id_a').val()) || 0;
  var b = parseFloat($('#id_b').val()) || 0;
  var c = parseFloat($('#id_c').val()) || 0;
  var d = parseFloat($('#id_d').val()) || 0;
  var e = parseFloat($('#id_e').val()) || 0;

  var first = ((c * 3.175) / a).toFixed(0);
  var second = (a * e) + (d * (e - 1) + 15);
  var third = ((c * 3.175) - (a * first)) / first;

  z.value = first;
  x.value = second;
  y.value = !isNaN(third) ? third : 0;
});
input[type = "text"]
{
  width:90%;
}
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<br>
id_a<input type = "text" id = "id_a">
<br> id_b
<input type = "text" id = "id_b">
<br> id_c
<input type = "text" id = "id_c">
<br> id_d
<input type = "text" id = "id_d">
<br> id_e
<input type = "text" id = "id_e">
<br> id_x

<input type = "text" id = "id_x">
<br> id_y

<input type = "text" id = "id_y">
<br> id_z
<input type = "text" id = "id_z">
<br>

Просто сделайте parseFloat() в javascript, чтобы предотвратить это. Ниже приведен код вашей проблемы:

let a = parseFloat($('#id_a').val());
let b = parseFloat($('#id_b').val());
let c = parseFloat($('#id_c').val());
let d = parseFloat($('#id_d').val());
let e = parseFloat($('#id_e').val());

Надеюсь, эта работа для вас.

ОП актуальная проблема 123 / document.getElementById('id_z')

freedomn-m 15.02.2023 12:04

Другие вопросы по теме