首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Scheme Lisp中将字符串转换为确切的数字?

如何在Scheme Lisp中将字符串转换为确切的数字?
EN

Stack Overflow用户
提问于 2014-04-12 06:35:16
回答 1查看 1K关注 0票数 1

例如,我有一个字符串:"6119726089.12814713“

如果我使用(string->number "6119726089.12814713") --使用SISC实现,结果是6.119726089128147e9 --在Guile实现中是6119726089.128147,但是我想要一个确切的数字,比如:611972608912814713/100000000而不丢失精度。

我想要一个类似(字符串->确切)之类的函数。

注意:请修复我的非母语英语并删除此邮件。谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-12 06:40:53

使用(string->number "#e6119726089.12814713")解析确切的数字。这至少适用于球拍和诡计。但是,它可能不能在其他Scheme实现上正确工作;它们可以先解析为不精确,然后再转换。

下面是OP要求的string->exact函数的可移植实现。我已经用一系列输入手动测试了它,但是您应该自己进行测试,以确保它符合您的需要:

代码语言:javascript
复制
(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))))))
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23027030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档