Добавлено округление количества для корректного отображения в POS
Проблема: - JavaScript float arithmetic даёт погрешность при вычислениях - На карточке товара показывалось -0.050000000000044 - Происходило при: available - reserved - inCart Решение: - Добавлена функция roundQuantity(value, decimals=3) - Округляет результат вычислений до 3 знаков после запятой - Применяется ТОЛЬКО для отображения, не для расчётов - Используется для: free, reserved, inCart в карточках товаров Результат: - Отображение: -0.05 вместо -0.050000000000044 - Данные с бэка остаются точными (строка) - Погрешность устранена только визуально Примечание: - Округление в JS НЕИЗБЕЖНО для отображения - Это НЕ маскировка - это правильное форматирование - Бэкенд уже отдаёт точные данные как строки
This commit is contained in:
@@ -1,5 +1,17 @@
|
||||
// POS Terminal JavaScript
|
||||
|
||||
/**
|
||||
* Округляет число до N знаков после запятой для корректного отображения.
|
||||
* Решает проблему погрешности float arithmetic в JavaScript.
|
||||
* @param {number} value - Число для округления
|
||||
* @param {number} decimals - Количество знаков после запятой (по умолчанию 3)
|
||||
* @returns {number} Округлённое число
|
||||
*/
|
||||
function roundQuantity(value, decimals = 3) {
|
||||
if (value === null || value === undefined || isNaN(value)) return 0;
|
||||
return Math.round(value * Math.pow(10, decimals)) / Math.pow(10, decimals);
|
||||
}
|
||||
|
||||
const CATEGORIES = JSON.parse(document.getElementById('categoriesData').textContent);
|
||||
let ITEMS = []; // Будем загружать через API
|
||||
let showcaseKits = JSON.parse(document.getElementById('showcaseKitsData').textContent);
|
||||
@@ -595,10 +607,11 @@ function renderProducts() {
|
||||
const inCart = cart.has(cartKey) ? cart.get(cartKey).qty : 0;
|
||||
|
||||
const free = available - reserved - inCart;
|
||||
const freeRounded = roundQuantity(free, 3); // Округляем для отображения
|
||||
|
||||
// Создаём элементы для стилизации разных размеров
|
||||
const freeSpan = document.createElement('span');
|
||||
freeSpan.textContent = free;
|
||||
freeSpan.textContent = freeRounded; // Используем округлённое значение
|
||||
freeSpan.style.fontSize = '1.1em';
|
||||
freeSpan.style.fontWeight = 'bold';
|
||||
freeSpan.style.fontStyle = 'normal';
|
||||
@@ -606,10 +619,10 @@ function renderProducts() {
|
||||
// Отображаем резерв и корзину если они есть
|
||||
const suffixParts = [];
|
||||
if (reserved > 0) {
|
||||
suffixParts.push(`−${reserved}`);
|
||||
suffixParts.push(`−${roundQuantity(reserved, 3)}`);
|
||||
}
|
||||
if (inCart > 0) {
|
||||
suffixParts.push(`−${inCart}🛒`);
|
||||
suffixParts.push(`−${roundQuantity(inCart, 3)}🛒`);
|
||||
}
|
||||
|
||||
if (suffixParts.length > 0) {
|
||||
|
||||
Reference in New Issue
Block a user