@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 (плюс минус пару сотых)
  • Вопрос задан
  • 78 просмотров
Решения вопроса 3
rockon404
@rockon404
Frontend Developer
Математика в JavaScript

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

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


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

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

Войти через TM ID
Похожие вопросы
Biganto Москва
от 130 000 до 130 000 руб.
от 2 500 до 4 000 usd.
HTML Academy Москва
от 85 000 до 100 000 руб.
15 авг. 2018, в 22:39
60000 руб./за проект
15 авг. 2018, в 22:01
6000 руб./за проект
15 авг. 2018, в 21:18
30000 руб./за проект