gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:53:46 24 4
gpt4 key购买 nike

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

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

我想要一个像 (string->exact) 或类似的函数。

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

最佳答案

使用 (string->number "#e6119726089.12814713") 精确解析数字。这至少适用于 Racket 和 Guile。但是,它可能无法在其他 Scheme 实现上正常工作;他们可以自由地首先解析为不精确,然后再转换。


这是 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))))))

关于scheme - 如何在 Scheme Lisp 中将字符串转换为精确数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23027030/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com