Добавлено округление количества для корректного отображения в 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
|
// 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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user