在不打印小数点后面的零的情况下格式化浮点数

4
我希望以更好的方式打印浮点数。具体而言,我希望在小数点后打印两个数字,但仅在这些数字不为零时才这样做。
如果该数字不是偶数,则此方法有效:
(let ((f 1.240))
  (format t "~,2F" f))

--> 1.24 

但是如果这个数字是整数,我会得到这个结果:
(let ((f 1240))
  (format t "~,2F" f))

-->1240.00

有没有一种优雅的方式来处理这个问题,或者我必须在打印之前手动检查小数点的数量?

2个回答

3
我不认为这可以使用标准格式指令完成。您可以编写自定义格式函数:
(defun my-f (stream arg &optional colon at digits)
  (declare (ignore colon at))
  (prin1 (cond ((= (round arg) arg) (round arg))
               (digits (float (/ (round (* arg (expt 10 digits)))
                                 (expt 10 digits))))
               (t arg))
         stream))

然后像这样使用:

CL-USER> (format t "~/my-f/" 1)
1
NIL
CL-USER> (format t "~/my-f/" 1.0)
1
NIL
CL-USER> (format t "~/my-f/" pi)
3.141592653589793D0
NIL
CL-USER> (format t "~/my-f/" 1.5)
1.5
NIL
CL-USER> (format t "~2/my-f/" 1)
1
NIL
CL-USER> (format t "~2/my-f/" 1.0)
1
NIL
CL-USER> (format t "~2/my-f/" pi)
3.14
NIL
CL-USER> (format t "~2/my-f/" 1.5)
1.5
NIL

0

你可以使用 FORMAT 条件表达式:

(let ((f 1240))
  (format t "~:[~,2f~;~d~]" (integerp f) f))

--> 1240

1
(let ((f 1.1)) (format t "~:[~,2f~;~d~]" (integerp f) f)) 打印出 1.10,但他不想要尾随的零。不过他又写道 "只有这些数字不是零的时候",因此从技术上讲,你仍然符合规格。 :) - danlei

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接