Оценивают ли старые версии javascript ( "-1" <0) как ложные?

Немного js на сайте моего брата eCommerce вычисляет и сохраняет итоговые суммы транзакций каждый раз, когда кто-то проверяет. Периодически отрицательное значение сохраняется для tracker_total_amount. В то время как он пытается понять, почему, он решил жестко закодировать переопределение, которое должно касаться ~ 0,1% транзакций с бессмысленными значениями. Это выглядит так:

var tracker_total_amount = parseFloat(tracker.total_amount).toFixed(2);
    if(tracker_total_amount < 0){
        tracker_total_amount = 0;
    }

Отрицательные значения продолжают отображаться в системе.

Оригинальная теория:

Я не думаю, что он должен использовать .toFixed, потому что это собирается отбросить tracker_total_amount как строку, которая, на мой взгляд, остановила бы if < 0 работает как ожидалось. Я был вполне доволен этим объяснением, пока не проверил его, и работа над ним не работала. См. Здесь: http://jsfiddle.net/yXTrz/

Новая теория:

Различные пользователи используют разные версии javascript. В некотором очень маленьком подмножестве используется древняя версия javascript, которая (вместо того, чтобы полезно преобразовывать строку в float, как моя, делает) продолжает рассматривать ее как строку и всегда оценивает tracker_total_amount как > 0, предотвращая переключение из режима.

Вопрос:

Была ли более ранняя версия javascript таким образом? Могут ли некоторые пользователи по-прежнему запускать эти старые версии? Лучше всего - есть ли способ смоделировать устаревшие версии javascript, чтобы доказать свою теорию?

Изменить: я должен указать, что все важные вещи (оплата и т.д.) зависит от вычисленного значения на стороне сервера. Номера здесь - это то, что хранится в Google Analytics, поэтому - пока можно манипулировать - результаты не будут слишком ужасными.

Ответ 1

Вы можете получить очень маленькие отрицательные значения для прохождения, т.е. -0.001, потому что значение устанавливается на фиксированное. Не знаете, какие негативы вы видите, но все, что выходит за пределы фиксированной стоимости как отрицательной, позволит отрицательно пройти. Извините, должно быть более ясно, если есть дополнительные вычисления, которые не используют возвращаемое значение, а не исходное значение... Возвращаемое значение будет -0.00... Итак, если это просто используется в качестве теста...

Ответ 2

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

var tracker_total_amount = parseFloat(tracker.total_amount);
if (tracker_total_amount < 0) {
    tracker_total_amount = 0;
}
tracker_total_amount = tracker_total_amount.toFixed(2);

Ответ 3

  • О "почему": ответ @Kevin правильный, вы можете проверить его на самом коде, к которому вы привязались.
  • О том, как это исправить: @Nerdwood ответ велик. Выполняйте все вычисления в числовых типах (с округлением, как ожидалось), и только конвертируйте их в границах.

Но я хотел бы добавить две точки, которые нужно проверить:

  • Убедитесь, что ваш JS-код правильно обновлен, поэтому браузеры клиентов не извлекают кешированную версию без "исправления".
  • Убедитесь, что это поле не установлено или не обновлено нигде.