Ошибочный результат, когда язык сценариев JavaScript выполняет Операцию внутри Функции

У меня есть проблема с JS, я должен вводить два данных в компьютер и из этих данных я должен доставать налог 18 % и субобщее количество, прямо сейчас стараюсь доставать субобщее количество и меня вытекают плохо операция, я не очень знаю в JS.

Код

function subtotal (valor) {
valor = parseInt(valor);
var total = 1;
var igv = 0.18;
total = document.getElementById('spTotal').innerHTML;
total = (total == null || total == undefined || total == "") ? 1 : total;
sub = (parseInt(total) * parseInt(valor))
sub2= (sub * igv);
total = (sub - sub2);
document.getElementById('spTotal').innerHTML = total;}
<div class="row">
   <div class="form-group col-md-5">
     <label for="recipient-name" class="control-label">Precio Unit.:</label>
     <input type="text" class="form-control" id="recipient-name1" id="txt_campo_1" onchange="subtotal(this.value);">
   </div>
   <div class="form-group col-md-5">
     <label for="recipient-name" class="control-label">Cantidad:</label>
     <input type="text" class="form-control" id="recipient-name1" id="txt_campo_2" onchange="subtotal(this.value);">
   </div>
  </div>
  <div class="row">
  <div class="form-group col-md-4">
    <label for="recipient-name" class="control-label">Sub Total:</label>
    <label type="text" class="" for="" id="spTotal"></label>
  </div>
  <div class="form-group col-md-4">
    <label for="recipient-name" class="control-label">IGV (18%):</label>
    <input type="text" class="form-control" id="recipient-name1" disabled>
  </div>
  <div class="form-group col-md-4">
    <label for="recipient-name" class="control-label">Total:</label><br>
    <label type="text" class="" for="" id="spTotal"></label>
  </div>
 </div>
4
задан 23.09.2018, 22:12
3 ответа

Проблема - что estГЎ re вычисляя subtotal, когда вводит информацию в компьютер второй раз в нее funciГіn, а именно в момент изменения количества или цены за единицу товара.

AdemГЎs есть очень превосходные проблемы.

  • DeberГЎ определять единственного идентификатора для полей и предпочтения, которое они были бы описательными.
  • , Если он ждет стоимость numГ©ricos, deberГ, - чтобы использовать неудар в лунку такого типа number как первый шаг validaciГіn.
  • estГЎ основывая в контенте того, что бросает innerHTML из label, правильном serГ, - чтобы соглашаться на textContent.
  • , Если он работает с такой стоимостью как ценами, количеством, полной, годится использовать parseFloat вместо parseInt.
  • я не думаю, что должны перемещать одну ту же стоимость funciГіn с различным значением, так как я не вижу, где я санкционировал, что parГЎmetro говорится о количестве или о precioUnitario. (он aquГ - где у него есть ошибки lГіgica)
  • Общее количество вычисляется как конечный результат, но у Вас перед тем, как реализовывать операции multiplicaciГіn, уже есть распределенный стоимость. ВїPor quГ©?

    total = document.getElementById('spTotal').innerHTML;
    total = (total == null || total == undefined || total == "") ? 1 : total;
    

CГіdigo с Процессом mГЎs простой и чистый понимания. (Он может улучшать это или приспосабливать это к тому, что он желает, использовал toFixed, чтобы форматировать стоимость в 2 десятичные цифры)

var igv = 0.18;
//Referencias que no cambiarán
var lblSubTotal = document.getElementById('spSubTotal');
var lblTotal = document.getElementById('spTotal');
var inputIGV = document.getElementById('totaligv');
function subtotal () {
    //Obtenemos la cantidad y el precio,si no hay valor asignamos 1 
    let cantidad = parseFloat(document.getElementById('cantidad').value) || 1;
    let precioU = parseFloat(document.getElementById('precio').value) || 1;
    //Realizamos las operaciones básicas de multiplicación y resta
    let subtotalSinIGV = cantidad * precioU;
    let totalIGV =  (subtotalSinIGV*igv);
    let subtotalConIGV = subtotalSinIGV  - totalIGV;
    //Asignamos los valores  a los labels o inputs respectivos.
    lblSubTotal.textContent = subtotalConIGV.toFixed(2);
    inputIGV.value = totalIGV.toFixed(2);
    lblTotal.textContent =subtotalSinIGV;
}
<div class="row">
   <div class="form-group col-md-5">
     <label for="recipient-name" class="control-label">Precio Unit.:</label>
     <input type="text" class="form-control"  id="precio" onchange="subtotal();">
   </div>
   <div class="form-group col-md-5">
     <label for="recipient-name" class="control-label">Cantidad:</label>
     <input type="text" class="form-control" id="cantidad" onchange="subtotal();">
   </div>
  </div>
  <div class="row">
  <div class="form-group col-md-4">
    <label for="recipient-name" class="control-label">Sub Total:</label>
    <label type="number"  id="spSubTotal"></label>
  </div>
  <div class="form-group col-md-4">
    <label for="recipient-name" class="control-label">IGV (18%):</label>
    <input type="number" class="form-control" id="totaligv" disabled>
  </div>
  <div class="form-group col-md-4">
    <label for="recipient-name" class="control-label">Total:</label><br>
    <label type="text" class="" id="spTotal"></label>
  </div>
 </div>
1
ответ дан 20.11.2019, 05:04
  • 1
    Если у тебя есть цена за единицу товара 10 и 10 единиц, покажи субобщее количество 82, не deberí когда его быть 100? И на этот вычисляет общее количество с IGV? Ademá s, default поддерживают в полях vací вы в 0 и не в 1, в случае, который размещал себе бы количество, но я не оцениваю. – Jocksan Cruz 24.09.2018, 01:03

Я сделал изменения в нескольких частях, я объясняю тебе:

  1. у Тебя Есть повторенные идентификаторы или какие-то этикетки с 2 пойдите.
  2. Рекомендуемый способ снабжать ссылками один input - с value.
  3. Javascript включи isNaN, которые санкционируют, если переменная is-Not-a-Number. У Меня остается
  4. сомнение с нею lГіgica, который ты используешь, в этом высшем случае стоимость налога и общего количества, но я вижу, что ты применяешь вычитание.
  5. Твоя стоимость меняется, потому что в обоих неудар в лунку ты призываешь subtotal(this.value), от случая к случаю тебя вычисляет количество и в других унитарная стоимость, в этом случае лучше снабжать ссылками одну funciГіn javascript, что получил стоимость и выполнил ее aritmГ©tica.

function subtotal () {
  var precio = parseInt(document.getElementById('txt_campo_1').value);
  var cantidad = parseInt(document.getElementById('txt_campo_2').value);
  var igv = 0.18;
  var sub = precio * cantidad;
  var igvAplicado = sub * igv
  var total = sub + igvAplicado;
  document.getElementById('recipient-name1').value = isNaN(igvAplicado) ? 0 : igvAplicado;
  document.getElementById('spSTotal').innerHTML = isNaN(sub) ? 0 : sub;
  document.getElementById('spTotal').innerHTML = isNaN(total) ? 0 : total;
}
<div class="container">
  <div class="row">
   <div class="form-group col-md-5">
     <label for="recipient-name" class="control-label">Precio Unit.:</label>
     <input type="text" class="form-control" id="txt_campo_1" onchange="javascript:subtotal();">
   </div>
   <div class="form-group col-md-5">
     <label for="recipient-name" class="control-label">Cantidad:</label>
     <input type="text" class="form-control" id="txt_campo_2" onchange="javascript:subtotal();">
   </div>
  </div>
  <div class="row">
  <div class="form-group col-md-4">
    <label for="recipient-name" class="control-label">Sub Total:</label>
    <label type="text" class="" for="" id="spSTotal"></label>
  </div>
  <div class="form-group col-md-4">
    <label for="recipient-name" class="control-label">IGV (18%):</label>
    <input type="text" class="form-control" id="recipient-name1" disabled>
  </div>
  <div class="form-group col-md-4">
    <label for="recipient-name" class="control-label">Total:</label><br>
    <label type="text" class="" for="" id="spTotal"></label>
  </div>
 </div>
</div>
2
ответ дан 20.11.2019, 05:04

Я думаю, что субобщего количества unidad * cantidad, налог - %18 субобщего количества, и чтобы вычислять общее количество, его 1.18 * subtotal.

Имя ее funciГіn она cambiГ© из-за calcular, всегда я помещаю имена глаголов или действий.

Нужно иметь в виду, что не deberГ-an существовать несколько элементов с тем же самым id, а именно, которые у всех были бы, имя recipient-name1 - проблема, оно как будто у всех людей было то же имя, невозможно дифференцировать их. Они cambiГ© из-за unidad, cantidad, subtotal, impuesto и total.

CambiГ© onchange из-за onkeyup для того, чтобы он явился результатом, нажав на клавиши, но это на вкус каждого.

могут использовать getElementById обычно или использовать это способа, упрощенного с собственными переменными.

Один обычно harГ - в это: document.getElementById("elemento").value, но благодаря тому, что она funciГіn есть у длинного имени, возможно делать следующее.

var d = document
d.o = d.getElementById
var o = (x,y)=>y!=null?d.o(x).value=y:d.o(x).value

После этого, использовать это таким образом.

  • , В случае когда получает стоимость: o(id)
  • , В случае когда распределяет стоимость: o(id,valor)

Эта funciГіn получает два аргумента, один id элемента и другой - стоимость, которая, если он существует, распределяет это ему в элемент. Для этого он использует getElementById, герметизируемый в корпусе в переменной с именем mГЎs коротко, чего d.o, но окончательно это то же самое.

Стоимость единицы, возможно получать таким образом, o("unidad"), в этом случае типа переменной String. Чтобы обращать один String в Number (с цепи символов до nГєmero), помещают один + таким образом +o("unidad") сначала, в моем случае serГ, - хотя он не необходим, потому что JavaScript, умножив два String, перемещает их Number automГЎticamente.

, Если себе хочет показать один mГЎximo десятичные 2, могут использовать toFixed для того, чтобы у него было 2 десятичные, и использовать +, чтобы это конвертировать в nГєmero, asГ - могут быть 2 как mГЎximo и не всегда 2. В моем случае я это делаю таким образом: +y.toFixed(2)

Относительно нее lГіgica, что используется, чтобы вычислять IGV , я считаю, что, если субобщее количество - 1, общее количество должно быть 1.18... В Интернете encontrГ© ссылка , где они это делают таким образом, хотя другие это podrГ-an делать различно.

CГіdigo:

var d = document
d.o = d.getElementById
var o = (x,y)=>y!=null?d.o(x).value=+y.toFixed(2):d.o(x).value
function calcular()
{
	var unidad = o("unidad")
	var cantidad = o("cantidad")
	var impuesto = 18/100
	var subtotal = unidad * cantidad
	o("subtotal", subtotal)
	o("impuesto", subtotal * impuesto)
	o("total", subtotal * (1+impuesto))
}
<div>Unidad: <input id="unidad" onkeyup="calcular()"></div>
<div>Cantidad: <input id="cantidad" onkeyup="calcular()"></div>
<div>Subtotal: <input id="subtotal" disabled /><div>
<div>IGV (18%): <input id="impuesto" disabled /><div>
<div> Total: <input id="total" disabled /><div>
2
ответ дан 20.11.2019, 05:04
  • 1
    có я говорю, что он точный и краткий, но habrí в который объяснять в OP какие-то части как например, из-за которого использует оператор + перед value, или из-за которого я не выбрал элемент с tí я шифрую getElementById. Так как как он говорит, está начинаясь с языком сценариев JavaScript – Dev. Joel 24.09.2018, 07:18
  • 2
    @Dev. Джоэл Грэкиас, edité ответ объясняя эти концепции, я надеюсь, что он понятный. – ArtEze 24.09.2018, 08:33

Теги

Похожие вопросы