Задать вопрос
@Vadim1899

Откуда появляется непонятная дробная часть при вычислениях?

Всем привет! Имеется код:
itemsAmount = 0; 

$(".to-cart").click(function(){

var itemCoast = $(this).children('.inv-tr-item').children('.inv-item-price').text();  // Вытягиваем из дива содержимое (напр. "Цена 100,23)
itemCoast = itemCoast.replace(/[^-0-9,]/gim,''); // обрезаем "цена", оставляем только цифры (100,23)
itemCoast = itemCoast.replace(/\,/g, '.'); // Меняем запятую на точку (100.23)
itemCoast = parseFloat(itemCoast); // Парсим из строки во флоат (100.23)

if ($(this).hasClass("on-cart")) { // проверяем, есть ли товар уже в корзине через .hasClass

	itemsAmount = itemsAmount - itemCoast; // из общей суммы корзины вычитаем стоимость товара

}else{
	
	itemsAmount = itemsAmount + itemCoast; // к общей сумме корзины прибавляем стоимость товара
}

$('.cart-total span').html(itemsAmount); // Выводим стоимость в спан

});


И проблема в том, что если в корзину положить товар за 349,39, затем 304,05, а затем из корзины удалить второй товар за 304,05, то стоимость корзины будет не 349,39, а 349.39000000000004. Никак не могу понять в чем проблема.

Пробовал округление до сотых, то в таком случае, если добавить много товаров, а потом все удалить, то сумма корзины будет не ноль, а -0.01 (плюс минус пару сотых)
  • Вопрос задан
  • 163 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 3
rockon404
@rockon404
Frontend Developer
Математика в JavaScript

Вообще забудьте о таких способах вычисления состояния:
itemsAmount = itemsAmount - itemCoast; // из общей суммы корзины вычитаем стоимость товара

Храните модель состояния и пересчитывайте сумму по ней при каждом ее изменении. Округляйте числа только после вычислений.
Ответ написан
Комментировать
yarkov
@yarkov Куратор тега JavaScript
Помог ответ? Отметь решением.
Это всего лишь одна из особенностей JS, с которой надо смириться.
https://habrahabr.ru/post/312880/
Ответ написан
Комментировать
@Vadim1899 Автор вопроса
Решил с помощью:
itemsAmount = itemsAmount.toFixed(2);
itemsAmount = itemsAmount = parseFloat(itemsAmount);


Теперь все работает
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Храните цену в целых числах (копейках, центах и т.п). Выделяйте дробную часть только для показа человеку.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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