Puede haber implementaciones en las que (format nil "~,100F" x)
haga lo que desee. Pero en la mayoría de estos primeros convierte a un flotador, luego calcula los dígitos, que pierde precisión.
No es demasiado difícil de programar el suyo. La idea es calcular las partes antes y después del punto decimal como números enteros por separado. Aquí está mi propuesta:
(defun number->string-with-fixed-decimal-places (x width &optional stream)
"Print an approximation of <x> with <width> digits after the decimal point."
(multiple-value-bind (int dec) (truncate x)
(let ((dec-shifted (truncate (* (abs dec) (expt 10 width)))))
(format stream "~d.~v,vd" int width #\0 dec-shifted))))
Otra aplicación muy popular: Calc de Dave Gillespie implementa precisión arbitraria de punto flotante en Elisp (que en sí mismo no tiene ni siquiera bigints!). – Ken