문제

예를 들어,이 문자열:"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))))))
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top