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

如何在Scheme Lisp中将字符串转换为精确数字?,scheme,lisp,r5rs,guile,sisc,Scheme,Lisp,R5rs,Guile,Sisc,例如,我有一个字符串:“6119726089.12814713” 如果我执行(字符串->数字“611972608912814713”)-使用SISC实现,结果是6.119726089128147e9-在Guile中实现是6119726089128147,但我想要一个精确的数字,比如:611972608912814713/100000000 我想要一个像(string->exact)这样的函数或类似的东西 注意:请修复我的非母语英语并删除此邮件。谢谢。使用(字符串->数字“6119726089.1

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

如果我执行
(字符串->数字“611972608912814713”)
-使用SISC实现,结果是
6.119726089128147e9
-在Guile中实现是
6119726089128147
,但我想要一个精确的数字,比如:
611972608912814713/100000000

我想要一个像(string->exact)这样的函数或类似的东西

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

使用
(字符串->数字“6119726089.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))))))
(定义(字符串->精确字符串)
(定义零(字符->整数#\0))
(let循环((结果#f)
(因素1)
(见圆点?#f)
(数字(字符串->列表字符串)))
(如果为空数字)
(和结果(/结果系数))
(let((当前(车辆数字))
(下一个(cdr数字)))
(条件((和(非结果)(不可见点?)(字符=?cur \-)
(循环结果(-factor)见点?下一步)
((和(不见点?)(字符=?cur\)
(循环结果因子#t next))
((charinteger cur)零)
(如果看到点?(*系数10)系数)
看到了吗?下一个)
(else#f()("(")))

非常感谢!它在Guile:611972608912814713/100000000上工作得非常好。但为什么不在SISC呢?在SISC中,结果是305986304456407356262207031/50000000000000000,即6119726089.12814712524414062-你知道为什么吗?听起来SISC首先将数字解析为不精确,然后将其转换为精确的“事后”数字:-(我认为这是有缺陷的行为,但从技术上讲(如果我没记错的话),标准允许这样做。Meh.Reference:@FelipeMicaroniLalli我终于开始编写一个可移植的
string->exact
函数的实现。当然,这已经晚了近3年,但我希望你还是觉得它有用。:-)