例如,我有这个字符串:“6119726089.12814713”

如果我做生意古代码 - 使用SISC实现结果是生成的,并且在轴承中实现是生成的,但我想要一个确切的数字,如:生成的损失精度。

我想要一个函数(字符串 - >准确)或类似的东西。

注意:请修复我的非原生英语并删除此消息。谢谢。

有帮助吗?

解决方案

使用(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