Добавление суммы добавляемых флажков вместо добавления

#javascript

#javascript

Вопрос:

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

Это мой код:

 <script>
$(document).ready(function() {
    function updateSum() {
      var total = "0.00";
      $(".sum:checked").each(function(i, n) { total  = parseFloat($(n).val()).toFixed(2); })
      $("#total").val(total);
    }
    // run the update on every checkbox change and on startup
    $("input.sum").change(updateSum);
    updateSum();
})
</script>
  

Когда я устанавливаю несколько флажков, я получаю: 1.002.003.00 вместо: 6.00

мой код выглядит правильно, я не могу видеть, что я пропустил. Любой совет по этому вопросу был бы оценен.

Комментарии:

1. Сначала посчитайте с числами … затем используйте toFixed() только для окончательного отображения

2. toFixed() возвращает строку.

Ответ №1:

Давайте посмотрим на кратком примере, как toFixed() ведет себя и как следует добавлять значения с плавающей точкой в JavaScript, если у вас есть исходное значение в виде строки:

 (function() {
   var total = '0.00';

   for (var i = 0; i < 5; i  ) {
      total = (parseFloat(total)   parseFloat(4.3)).toFixed(2);
   }

   console.log('total', {
      total: total,
      typeOfTotal: typeof(total)
   });
})();  

На основе приведенного ниже примера вы можете видеть, что toFixed() возвращает строку, поэтому я предлагаю изменить ваш код следующим образом, чтобы правильно добавлять числа:

 $(document).ready(function() {
    function updateSum() {
      var total = "0.00";
      $(".sum:checked").each(function(i, n) {
         let sum = parseFloat(total)   parseFloat($(n).val());
         total = sum.toFixed(2);
      });
      $("#total").val(total);
    }
    // run the update on every checkbox change and on startup
    $("input.sum").change(updateSum);
    updateSum();
});
  

Вы можете прочитать подробнее о Number.prototype.toFixed() и parseFloat() здесь.

Комментарии:

1. Спасибо! таким образом, он возвращает строку! я вижу, отмечено на будущее, еще раз спасибо 🙂

2. Почему у вас есть total = '0.00' ? даже если вы используете его для числовых вычислений? это должно быть число mate

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

Ответ №2:

  1. Измените значение total= ‘0.00’ на number (всего = 0.00 ) вместо string.
  2. toFixed возвращает строку, а не числа

 let x = 1.22

console.log(typeof (1.22).toFixed(2))