方案:十进制数的精度

时间:2012-04-08 17:39:21

标签: scheme decimal precision

如何在Scheme中将42.0转换为42.00? 例如(在方案中):
当我(/ 20.00 2)时,我得到10.0。我希望10.00作为上述结果,而不是10.0

4 个答案:

答案 0 :(得分:6)

Óscar的解决方案运行良好,但更简单的解决方案是使用SRFI-48,它提供了额外的格式指令。

(display (format "~0,2F" (/ 20.00 2)))

答案 1 :(得分:5)

10.010.00代表的对象是相同的。在R5RS Scheme中没有固定精度的十进制数。你需要什么固定精度?如果它与输出相关,则需要进行某种格式化打印。查看有关printfformat函数的Scheme实现文档。另一方面,如果您实际上需要十进制算术,则需要使用精确比率并根据您要使用的规则明确舍入,或者使用整数并将它们视为大小为1/100的单位。

答案 2 :(得分:4)

数字10.010.00完全相同。也许你想将输出格式化为点右边有一个固定小数位数的字符串?试试这个:

(define (right-pad number len)
  (let* ((nstr (number->string number))
         (diff (- len (string-length nstr)))
         (pads (if (> diff 0) (make-string diff #\0) "")))
    (string-append nstr pads)))

像这样使用:

(display (right-pad (/ 20.00 2) 5))
> 10.00

请注意,len参数表示结果字符串中所需的字符总数,包括点。该解决方案具有独立于外部库的优势。

答案 3 :(得分:0)

如果你使用球拍,我认为这可能有所帮助。

https://docs.racket-lang.org/reference/strings.html#%28def._%28%28lib.racket%2Fformat..rkt%29.~7er%29%29

  

(~r pi#:precision 4)

     

“3.1416”