From ccf98e8e60e5e3a01dbfa624e28967f42bcfdd42 Mon Sep 17 00:00:00 2001 From: Evan Sarkar Date: Sun, 29 Mar 2026 07:07:36 +0530 Subject: [PATCH] fix: round float params to 6 significant digits on file save MAVLink sends 32-bit floats; decoding them into JS 64-bit doubles introduces noise (e.g. 0.18000000715255737 instead of 0.18). Applying toPrecision(6) + parseFloat matches MissionPlanner behaviour and produces clean, human-readable parameter files. --- apps/desktop/src/main/ipc-handlers.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/apps/desktop/src/main/ipc-handlers.ts b/apps/desktop/src/main/ipc-handlers.ts index 2d1fd90..5eff0bd 100644 --- a/apps/desktop/src/main/ipc-handlers.ts +++ b/apps/desktop/src/main/ipc-handlers.ts @@ -3755,7 +3755,15 @@ export function setupIpcHandlers(mainWindow: BrowserWindow): void { ].filter(Boolean).join('\n'); // Format: PARAM_NAME,VALUE (one per line) - const content = header + '\n\n' + params.map(p => `${p.id},${p.value}`).join('\n'); + // MAVLink parameters are 32-bit floats. When decoded into JS 64-bit doubles + // they carry floating-point noise (e.g. 0.18000000715255737 instead of 0.18). + // toPrecision(6) recovers the original 6 significant digits; parseFloat strips + // trailing zeros so integers stored as floats still look clean (e.g. "1" not "1.00000"). + const formatValue = (value: number): string => { + if (Number.isInteger(value)) return String(value); + return String(parseFloat(value.toPrecision(6))); + }; + const content = header + '\n\n' + params.map(p => `${p.id},${formatValue(p.value)}`).join('\n'); const fs = await import('fs/promises'); await fs.writeFile(result.filePath, content, 'utf-8');