From 538eb1624b7cbf2a5c9ee89fade324d5193e9eb8 Mon Sep 17 00:00:00 2001 From: NetterSilver <133535268+Silvertree2010@users.noreply.github.com> Date: Sun, 25 Oct 2026 15:00:02 +0100 Subject: [PATCH] Fix FormCalc Round overflowing to infinity for large values (#4508) Found while testing crates/js/src/formcalc.rs:2114-2119 Co-authored-by: Claude Haiku 5.5 --- crates/js/src/formcalc.rs | 3 ++- crates/js/src/tests.rs | 6 ++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/crates/js/src/formcalc.rs b/crates/js/src/formcalc.rs index 5e7bb65fa..39ecdbde5 100644 --- a/crates/js/src/formcalc.rs +++ b/crates/js/src/formcalc.rs @@ -2115,7 +2115,8 @@ impl Interp<'_> { let a = self.arg_num(args, 0)?; let places = if args.len() > 1 { self.arg_num(args, 1)?.clamp(0.0, 12.0) as i32 } else { 0 }; let k = 10f64.powi(places); - Val::Num((a * k).round() / k) + let scaled = a * k; + if scaled.is_finite() { Val::Num(scaled.round() / k) } else { Val::Num(a) } } "count" => { // Non-null values and objects: an empty field doesn't count, a subform does. diff --git a/crates/js/src/tests.rs b/crates/js/src/tests.rs index 748ce038d..9e96dcd2e 100644 --- a/crates/js/src/tests.rs +++ b/crates/js/src/tests.rs @@ -1009,6 +1009,12 @@ mod formcalc { assert_eq!(calc(r#"Format("9.99", 2.344)"#), "2.34"); } + #[test] + fn round_keeps_huge_values_finite() { + assert_eq!(calc("Round(1e300, 12) == 1e300"), "1"); + assert_eq!(calc("Round(1.2345, 2)"), "1.23"); + } + #[test] fn built_in_functions_cover_the_common_set() { assert_eq!(calc("Abs(-2.5)"), "2.5");