From 60e462e987fab34016bbdf6c4ec0102d2b2cc40e Mon Sep 17 00:00:00 2001 From: Codex Agent Date: Sun, 8 Mar 2026 09:35:47 +0000 Subject: [PATCH] Fix rounding to 0 --- hdyc-svelte/src/lib/engine.ts | 8 +++++- tests/test_conversion_chart.py | 46 ++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 tests/test_conversion_chart.py diff --git a/hdyc-svelte/src/lib/engine.ts b/hdyc-svelte/src/lib/engine.ts index c573b64..28c0332 100644 --- a/hdyc-svelte/src/lib/engine.ts +++ b/hdyc-svelte/src/lib/engine.ts @@ -10,7 +10,13 @@ export interface SolveResult { } function fmt(n: number): string { - return parseFloat(n.toFixed(6)).toString(); + if (!Number.isFinite(n)) return n.toString(); + if (n === 0) return '0'; + if (Math.abs(n) < 1e-6) { + return n.toExponential(6); + } + const rounded = parseFloat(n.toFixed(6)); + return rounded.toString(); } function gcd(a: number, b: number): number { diff --git a/tests/test_conversion_chart.py b/tests/test_conversion_chart.py new file mode 100644 index 0000000..9deb750 --- /dev/null +++ b/tests/test_conversion_chart.py @@ -0,0 +1,46 @@ +import math +import re +import unittest +from pathlib import Path + + +ROOT = Path(__file__).resolve().parents[1] +CALCULATORS_TS = ROOT / "hdyc-svelte" / "src" / "lib" / "data" / "calculators.ts" +NUMERIC_SAMPLES = [0.1, 0.5, 1, 2, 5, 10, 20, 50, 100] +TARGET_SLUG = "angstroms-to-nautical-miles" + + +def _parse_factor(slug: str) -> float: + text = CALCULATORS_TS.read_text(encoding="utf-8") + match = re.search(rf'"slug": "{slug}".*?"factor": ([0-9.eE+-]+)', text, flags=re.S) + if not match: + raise AssertionError(f"Could not find calculator definition for '{slug}'") + return float(match.group(1)) + + +def _js_fmt(value: float) -> str: + if not math.isfinite(value): + return str(value) + if value == 0: + return "0" + abs_val = abs(value) + if abs_val < 1e-6: + return f"{value:.6e}" + rounded = float(f"{value:.6f}") + if rounded.is_integer(): + return str(int(rounded)) + return repr(rounded) + + +class QuickConversionChartRoundingTests(unittest.TestCase): + def test_angstroms_to_nautical_miles_chart_does_not_round_to_zero(self) -> None: + factor = _parse_factor(TARGET_SLUG) + outputs = [_js_fmt(sample * factor) for sample in NUMERIC_SAMPLES] + self.assertTrue( + any(output != "0" for output in outputs), + f"{TARGET_SLUG} quick conversion chart rounded every sample down to 0: {outputs}", + ) + + +if __name__ == "__main__": + unittest.main()