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 <noreply@anthropic.com>
This commit is contained in:
NetterSilver
2026-10-25 10:00:02 -04:00
committed by GitHub
co-authored by Claude Haiku 5.5
parent 4f9b16fa14
commit 538eb1624b
2 changed files with 8 additions and 1 deletions
+2 -1
View File
@@ -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.
+6
View File
@@ -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");