나는 어떻게 변환할 문자열로 정확한에서 숫자를 계획 Lisp?
문제
예를 들어,이 문자열:"6119726089.12814713"
내가 할 경우 (string->number "6119726089.12814713")
-사용하여 SISC 구현 결과 6.119726089128147e9
-과에서 교활한 구현이 6119726089.128147
하지만 나는 다음과 같은 정확한 숫자를,다음과 같: 611972608912814713/100000000
손실 없이 정밀도입니다.
나는 같은 기능은 다음과 같(string->정확한)또는 무언가가 이와 같습니다.
참고:요 내가 아닌 영어와 제거를 이 메시지입니다.감사합니다.
해결책
사 (string->number "#e6119726089.12814713")
분석 수으로 정확합니다.이 작품은 적어도에 대한 라켓고 거짓말.그것이 제대로 작동하지 않을 수 있습에서 다른 방식이 구현,그러나;그들은 자유로 구문 분석 정확하지 않은 첫째,그 변환합니다.
여기 휴대용의 구현 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))))))
제휴하지 않습니다 StackOverflow