Domanda

Ad esempio, ho questa stringa: "6119726089.12814713"

Se i (string->number "6119726089.12814713") - Utilizzando l'implementazione SISC Il risultato è 6.119726089128147e9 - e in Guile L'implementazione è 6119726089.128147 ma vorrei un numero esatto, come: 611972608912814713/100000000 senza precisione di perdita.

Mi piacerebbe una funzione come (stringa-> esatta) o qualcosa del genere.

Nota: risolvere il mio inglese non nativo e rimuovere questo messaggio.Grazie.

È stato utile?

Soluzione

Utilizzare (string->number "#e6119726089.12814713") per analizzare il numero come esatto.Questo funziona per almeno racchetta e chili.Potrebbe non funzionare correttamente su altre implementazioni schemi, tuttavia;Sono alla libertà di analizzare prima inesattamente, quindi convertire.


.

Ecco un'implementazione portatile della funzione string->exact che l'op ha richiesto.L'ho testato manualmente con una gamma di input, ma dovresti fare i tuoi test per assicurarti che si adatta alle tue esigenze:

(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))))))
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top