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
相关产品推荐
相关产品推荐

