diff --git a/Marlin/src/gcode/motion/G2_G3.cpp b/Marlin/src/gcode/motion/G2_G3.cpp
index 0352947cca..91923121c5 100644
--- a/Marlin/src/gcode/motion/G2_G3.cpp
+++ b/Marlin/src/gcode/motion/G2_G3.cpp
@@ -103,21 +103,21 @@ void plan_arc(
 
   const feedRate_t scaled_fr_mm_s = MMS_SCALED(feedrate_mm_s);
 
-  #ifdef ARC_SEGMENTS_PER_R
-    float seg_length = MM_PER_ARC_SEGMENT * radius;
-    LIMIT(seg_length, MM_PER_ARC_SEGMENT, ARC_SEGMENTS_PER_R);
-  #elif ARC_SEGMENTS_PER_SEC
-    float seg_length = scaled_fr_mm_s * RECIPROCAL(ARC_SEGMENTS_PER_SEC);
-    NOLESS(seg_length, MM_PER_ARC_SEGMENT);
-  #else
-    constexpr float seg_length = MM_PER_ARC_SEGMENT;
-  #endif
-
-  // Length divided by segment size gives segment count
+  // Start with a nominal segment length
+  float seg_length = (
+    #ifdef ARC_SEGMENTS_PER_R
+      constrain(MM_PER_ARC_SEGMENT * radius, MM_PER_ARC_SEGMENT, ARC_SEGMENTS_PER_R)
+    #elif ARC_SEGMENTS_PER_SEC
+      _MAX(scaled_fr_mm_s * RECIPROCAL(ARC_SEGMENTS_PER_SEC), MM_PER_ARC_SEGMENT)
+    #else
+      MM_PER_ARC_SEGMENT
+    #endif
+  );
+  // Divide total travel by nominal segment length
   uint16_t segments = FLOOR(mm_of_travel / seg_length);
-  if (segments < min_segments) {
-    segments = min_segments;                      // No fewer than the minimum
-    seg_length = mm_of_travel / segments;         // A new segment length
+  if (segments < min_segments) {            // Too few segments?
+    segments = min_segments;                // More segments
+    seg_length = mm_of_travel / segments;   // but also shorter
   }
 
   /**