四捨五入する - lisp-cookbook-ja/common-lisp GitHub Wiki

数値

四捨五入する

Common Lisp の round 関数は偶数丸めで四捨五入ではありません。 よって四捨五入をしたい場合は自作する必要があります。

簡単な実装例を示します。

;; その1
(defun nearest-1 (number)
  (values (floor (+ 0.5 number))))

;; その2
;; number や divisor が負の時のことは考えていません
(defun nearest-2 (number &optional (divisor 1))
  (if (>= (- number (* (floor number divisor) divisor)) (/ divisor 2))
      (ceiling number divisor)
      (floor number divisor)))

;; roundは以下のように 偶数方向へ丸められる
(round 10.5)
; => 10
;    0.5

(round 11.5)
; => 12
;    -0.5