diff --git a/crates/geom/src/tests.rs b/crates/geom/src/tests.rs index 019f22b83..897b9cbe6 100644 --- a/crates/geom/src/tests.rs +++ b/crates/geom/src/tests.rs @@ -306,6 +306,12 @@ fn round_to_handles_large_precision_without_changing_finite_values() { assert_eq!(round_to(1.23456, 2), 1.23); } +#[test] +fn round_to_keeps_huge_finite_values_finite() { + assert_eq!(round_to(1e307, 2), 1e307); + assert_eq!(round_to(-1e307, 2), -1e307); +} + #[test] fn reverse_subpaths_preserves_open_and_closed() { let mut open = BezPath::new(); diff --git a/crates/geom/src/transform.rs b/crates/geom/src/transform.rs index 69c6c788d..e0e743cd4 100644 --- a/crates/geom/src/transform.rs +++ b/crates/geom/src/transform.rs @@ -60,6 +60,11 @@ pub fn round_to(v: f64, digits: i32) -> f64 { if v.is_finite() && !f.is_finite() { return v; } - let r = (v * f).round() / f; + let scaled = v * f; + if v.is_finite() && !scaled.is_finite() { + // Too large to have a fractional part at this scale; already whole. + return v; + } + let r = scaled.round() / f; if r == 0.0 { 0.0 } else { r } }