JavaScript - неправильное сравнение значений с плавающей точкой - PullRequest
0 голосов
/ 13 мая 2018

Есть два поля - faceValue fv2 и askPrice num2 - и askPrice не может быть меньше faceValue.

Чек почти работает, но при номинальной стоимости 10,00 предупреждение срабатывает только тогда, когда запрашиваемая цена равна 1,00 (9,00, 8,00 и т. Д. И т. Д. Не вызывают его). Однако, когда fv2 перезагружается в форму, это правильно - 10.00.

Как решить эту проблему? вот код

            // new askingPrice comparison

            var fv2 = parseFloat($('.ticketFaceValue').val()).toFixed(2).replace(/(\d)(?=(\d{3})+\.)/g, '$1,');
            var num2 = parseFloat($(this).val()).toFixed(2).replace(/(\d)(?=(\d{3})+\.)/g, '$1,');

            if (num2 < fv2) {
            alert('Sorry, your asking price can\'t be less than face value. Please change your asking price.');

            $(this).val(fv2);
            row.find('.askingPriceData').html(fv2);
            recalculateFees();
          }

            // end new askingPrice comparison

Ответы [ 2 ]

0 голосов
/ 13 мая 2018

toFixed() метод возвращает строку, поэтому вы сравниваете две строки.Попробуйте следующий код.

var fv2_float = parseFloat($('.ticketFaceValue').val()); 
var num2_float = parseFloat($(this).val());      

var fv2 = fv2_float.toFixed(2).replace(/(\d)(?=(\d{3})+\.)/g, '$1,');
var num2 = num2_float.toFixed(2).replace(/(\d)(?=(\d{3})+\.)/g, '$1,');

if (num2_float < fv2_float) {
   // Do your staff
}

Или попробуйте ниже одного, но это не очень эффективно.

// Your code goes here

if (parseFloat(num2) < parseFloat(fv2)) {
   // Do your staff
}
0 голосов
/ 13 мая 2018

Хотя вы используете parseFloat для преобразования входной строки в числовой тип, вы конвертируете ее обратно в строку с помощью toFixed, и поэтому сравнение основано на символах, а не на числовых значениях.

то, что вы пытаетесь сделать с помощью replace (добавьте разделители тысяч), также можно сделать с помощью toLocaleString, но вы должны позаботиться о том, чтобы не помещать эту отформатированную строку обратно в элемент input, так как он не будет анализироватьсякак число.Вероятно, лучше использовать отдельные переменные для числового значения и отформатированного значения.Может быть так:

var fv2 = +$('.ticketFaceValue').val()
var num2 = +$(this).val();
var fv2Fmt =fv2.toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2});
var num2Fmt =num2.toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2});

if (num2 < fv2) {
    alert('Sorry, your asking price can\'t be less than face value. Please change your asking price.');

    $(this).val(fv2);
    row.find('.askingPriceData').html(fv2Fmt);
    recalculateFees();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...