From 34c1cf6e71d9a3221c534799b72cc65bdf14c7cc Mon Sep 17 00:00:00 2001 From: tlartem Date: Fri, 25 Jul 2025 15:08:39 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BC=D0=B0=D1=88=D0=B8=D0=BD=D0=BD=D0=B0?= =?UTF-8?q?=D1=8F=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../spreadsheet-engine/spreadsheet-engine.ts | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/lib/spreadsheet-engine/spreadsheet-engine.ts b/src/lib/spreadsheet-engine/spreadsheet-engine.ts index 90a2fd8..7e9305d 100644 --- a/src/lib/spreadsheet-engine/spreadsheet-engine.ts +++ b/src/lib/spreadsheet-engine/spreadsheet-engine.ts @@ -13,6 +13,15 @@ const QUALIFIED_RANGE_RE = /\b[A-Za-z0-9_]+![A-Z]+[0-9]+:[A-Z]+[0-9]+\b/g // She // Типы для значений ячеек export type CellValue = string | number | boolean | null | undefined +// Утилитная функция для устранения машинной ошибки в числах с плавающей точкой +function fixFloatingPointError(value: CellValue): CellValue { + if (typeof value === 'number' && isFinite(value)) { + const factor = Math.pow(10, 14) + return Math.round(value * factor) / factor + } + return value +} + export class Cell { sheet: Sheet name: string @@ -248,7 +257,10 @@ export class Cell { // Создаём функцию с контекстом const func = new Function(...Object.keys(context), `return ${expr}`) - return func(...Object.values(context)) + const result = func(...Object.values(context)) + + // Исправляем машинную ошибку в 16-м символе после запятой + return fixFloatingPointError(result) } catch (error) { throw new Error(`Invalid expression: ${expr}`) } @@ -430,7 +442,10 @@ export class Workbook { if (this._dirty.has(qualifiedName)) { this.recalc() } - return this.getCell(qualifiedName).value + const value = this.getCell(qualifiedName).value + + // Исправляем машинную ошибку в 16-м символе после запятой для числовых значений + return fixFloatingPointError(value) } // Управление волатильными ячейками