Добавлено округление количества для корректного отображения в 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:
2026-01-02 15:38:41 +03:00
parent 4d121e95af
commit 1ead77b2d8

View File

@@ -1,5 +1,17 @@
// POS Terminal JavaScript // 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); const CATEGORIES = JSON.parse(document.getElementById('categoriesData').textContent);
let ITEMS = []; // Будем загружать через API let ITEMS = []; // Будем загружать через API
let showcaseKits = JSON.parse(document.getElementById('showcaseKitsData').textContent); 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 inCart = cart.has(cartKey) ? cart.get(cartKey).qty : 0;
const free = available - reserved - inCart; const free = available - reserved - inCart;
const freeRounded = roundQuantity(free, 3); // Округляем для отображения
// Создаём элементы для стилизации разных размеров // Создаём элементы для стилизации разных размеров
const freeSpan = document.createElement('span'); const freeSpan = document.createElement('span');
freeSpan.textContent = free; freeSpan.textContent = freeRounded; // Используем округлённое значение
freeSpan.style.fontSize = '1.1em'; freeSpan.style.fontSize = '1.1em';
freeSpan.style.fontWeight = 'bold'; freeSpan.style.fontWeight = 'bold';
freeSpan.style.fontStyle = 'normal'; freeSpan.style.fontStyle = 'normal';
@@ -606,10 +619,10 @@ function renderProducts() {
// Отображаем резерв и корзину если они есть // Отображаем резерв и корзину если они есть
const suffixParts = []; const suffixParts = [];
if (reserved > 0) { if (reserved > 0) {
suffixParts.push(`${reserved}`); suffixParts.push(`${roundQuantity(reserved, 3)}`);
} }
if (inCart > 0) { if (inCart > 0) {
suffixParts.push(`${inCart}🛒`); suffixParts.push(`${roundQuantity(inCart, 3)}🛒`);
} }
if (suffixParts.length > 0) { if (suffixParts.length > 0) {