質問

たとえば、この文字列を持っています。 "6119726089.12814713"

(string->number "6119726089.12814713")を実行する場合 - SISC実装の使用結果は6.119726089128147e9 - およびGUILE実装では6119726089.128147ですが、損失の正確なもののような正確な数字を希望します。

(String-> Exact)のような機能、またはこのようなもの。

注:ネイティブ以外の英語を修正してこのメッセージを削除してください。ありがとう。

役に立ちましたか?

解決

(string->number "#e6119726089.12814713")を使用して、数値を正確に解析します。これは少なくともラケットとガイルのために機能します。ただし、他のスキーム実装で正しく機能しない可能性があります。彼らは不正確なように解釈するための自由に、次に変換しています。


OPが尋ねたstring->exact関数の携帯用実装です。私はそれをさまざまな入力で手動でテストしましたが、あなたはそれがあなたのニーズに合うようにあなた自身のテストをするべきです:

(define (string->exact str)
  (define zero (char->integer #\0))
  (let loop ((result #f)
             (factor 1)
             (seen-dot? #f)
             (digits (string->list str)))
    (if (null? digits)
        (and result (/ result factor))
        (let ((cur (car digits))
              (next (cdr digits)))
          (cond ((and (not result) (not seen-dot?) (char=? cur #\-))
                 (loop result (- factor) seen-dot? next))
                ((and (not seen-dot?) (char=? cur #\.))
                 (loop result factor #t next))
                ((char<=? #\0 cur #\9)
                 (loop (+ (* (or result 0) 10) (- (char->integer cur) zero))
                       (if seen-dot? (* factor 10) factor)
                       seen-dot? next))
                (else #f))))))
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top