arnesi
(defvar *precision* 2
"Default precision.")
(defmacro with-precision (prec &body body)
"Evalute BODY with *precision* bound to @var{prec}."
(let ((precision (gensym)))[...]
`(let ((,precision ,prec))
(assert (integerp ,precision)
(,precision)
"Precision must be an integer, not ~S" ,precision)
(let ((*precision* (10^ ,precision)))
(declare (special *precision*))
,@body))))
(defun decimal-from-float (float &optional (precision *precision*) (rounding-method #'round-half-up))
"Convert @var{float} to an exact value with precision
@var{precision} using @var{rounding-method} to do any
neccessary rounding."
(funcall rounding-method float precision))
(defun float-from-decimal (decimal)
"Convert the exact decimal value @var{decimal} to a (not
neccassily equal) floating point value."
(float decimal))