如何在方案(drracket)中进行浮动转换?

How to do floating conversions in scheme (drracket)?

我想在方案语言中进行一些 bin 到 hex、hex 到 bin、hex 到 dec 等的转换。但我不习惯像高级用户那样打球。我需要将 3x4 实现为所有可能的二进制、十六进制、八进制和十进制对。

到目前为止我只实现了 bin 到 dec 的实现,但我没有处理其他人的想法,任何人都可以给我一些提示、想法或代码块以及所有有助于改进我的实现的方法吗?

我把我的垃圾桶放在了下面,谢谢大家。

(define (bin-to-dec x)
  (if (zero? x)
      x
      (+ (modulo x 10) (* 2 (bin->dec (quotient x 10))))))

祝你有个愉快的一天,注意安全。

Racket 有内置程序来处理这类事情。 number->string 将采用指定基数中的数字和 return 字符串表示形式。如果输入可以数字文字的形式给出,你可以这样做:

(number->string #b11111 16)  ==>  "1f"

如果目标是在字符串表示之间进行转换,以上可以与内置 string->number 结合使用,例如:

(define (nstring->nstring nstring radix-in radix-out)
  (number->string (string->number nstring radix-in) radix-out))
scratch.rkt> (nstring->nstring "11111" 2 16)
"1f"
scratch.rkt> (nstring->nstring "31" 10 2)
"11111"
scratch.rkt> (nstring->nstring "1f" 16 10)
"31"

第二个你在 Scheme 中有一个 fixnum(整数),基数并不重要,因为数字没有基数。原因是 base 与数字的视觉编码有关。例如。 10 可以写成 #b1010 #xa #o12 所有这些都将在 Scheme repl 中显示 10 因为 repl 以十进制显示数字表示:

#b1010 ; ==> 10
#xa    ; ==> 10
#o12   ; ==> 10

如果你想以不同的基数打印一个数字,当数字从数字变为可视化表示(例如字符串)时,你可以这样做。 Scheme 有这个 number->string

(number->string 10 2)  ; ==> "1010"
(number->string 10 16) ; ==> "a"
(number->string 10 8)  ; ==> "12"

还有string->int做相反的事情:

(string->number "1010" 2) ; ==> 10
(string->number "a" 16)   ; ==> 10
(string->number "12" 8)   ; ==> 10

您的实现 bin->dec 将任何基数作为输入并将其十进制可视化转换为二进制到十进制。例如

(bin-to-dec #b1010) ; ==> 2