有効桁数を指定して割り算

とある要件で小数点以下40位まで割り算する必要があった。
WindowsXPの電卓では無理(有効桁数32桁)なので、elispの勉強がてら書いてみた。

(defun div (dividend divisor precision &optional answer)
  (if (< precision 0)
      answer
    (setq quotient (truncate (/ dividend divisor)))
    (setq answer (concat answer (format "%d" quotient)))
    (if (= quotient 0)
        (div (* dividend 10) divisor (1- precision) answer)
      (div (* (% dividend divisor) 10) divisor (1- precision) answer))))

(div 4999 12350 40)                     ; => "04047773279352226720647773279352226720647"
(/ 4999 12350.0)                        ; => 0.4047773279352227

時間があればバージョンアップ予定だが、ちょっとした検証には耐えられそう。

Emacs Lispテクニックバイブル

Emacs Lispテクニックバイブル