You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Allegro Common Lisp中如何将列表内数字格式化为最多两位小数?

在Allegro Common Lisp中保留列表元素两位小数的方法

方法一:数学运算直接四舍五入

这是最简洁的实现方式,通过乘法移位、取整再还原小数点的逻辑完成两位小数的四舍五入:

(defun round-to-two-decimals (number)
  (/ (round (* number 100)) 100.0))

;; 调用示例
(mapcar #'round-to-two-decimals '(1.233453923729 3.44566546 9.1111111))
;; 返回结果:(1.23 3.45 9.11)
  • (* number 100)将小数点后两位移至整数位
  • round对结果执行四舍五入取整
  • 除以100.0恢复小数点位置,确保输出为浮点数

如果需要截断小数而非四舍五入,只需把round替换为floor:

(defun truncate-to-two-decimals (number)
  (/ (floor (* number 100)) 100.0))

方法二:使用字符串流完成写入与读取(匹配你的思路)

如果坚持用字符串流的流程处理,可按「写入格式化数值→读取生成新列表」的步骤实现:

(let* ((original-list '(1.233453923729 3.44566546 9.1111111))
       (output-stream (make-string-output-stream)))
  ;; 逐个写入元素,格式化为两位小数
  (dolist (num original-list)
    (format output-stream "~,2F " num))
  ;; 从生成的字符串中读取数值
  (with-input-from-string (input-stream (get-output-stream-string output-stream))
    (loop for val = (read input-stream nil nil)
          while val
          collect val)))
;; 返回结果:(1.23 3.45 9.11)
  • make-string-output-stream创建内存中的字符串输出流
  • format的~,2F指令指定输出两位小数的浮点数,自动执行四舍五入
  • get-output-stream-string取出流中存储的格式化字符串
  • with-input-from-string将字符串转为输入流,循环读取每个数值并收集为新列表

内容的提问来源于stack exchange,提问作者ponipei

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 23:40:34