如何在Lisp中控制浮点数的小数位数?示例:将89.833336转为89.83
在Lisp中控制浮点数小数位数的方法
你可以通过两种方式实现需求:一种是仅在输出时格式化显示两位小数(不改变原始数值),另一种是直接对数值进行四舍五入/截断处理(修改数值本身)。
1. 格式化输出(推荐,不改变原始数值)
Lisp的format函数支持丰富的格式控制,使用~,2f格式符即可将浮点数格式化为保留两位小数的形式(默认四舍五入)。
修改你的调用代码即可:
(defun average(&rest nums) (float (/ (apply #'+ nums) (length nums)))) ;; 格式化输出两位小数 (format t "~,2f~%" (average 99 97 78 88 99 78)) ; 输出 89.83
~,2f的含义:~f表示按浮点数格式输出,,2指定保留两位小数;若需要直接截断而非四舍五入,可以使用~,2,0f(第二个数字0表示截断模式)。
2. 修改数值本身(四舍五入到两位小数)
如果需要让函数直接返回保留两位小数的数值,可以通过先放大100倍、取整、再缩小100倍的方式实现:
(defun average(&rest nums) (let ((avg (float (/ (apply #'+ nums) (length nums))))) (/ (round (* avg 100)) 100.0))) ; round实现四舍五入,若要截断用truncate (average 99 97 78 88 99 78) ; 返回 89.83
- 使用
round会进行四舍五入,得到最接近的两位小数数值; - 如果需要直接截断小数部分(比如89.833336变成89.83而非89.84),可以把
round换成truncate。
内容的提问来源于stack exchange,提问作者David N Richards
相关产品推荐
相关产品推荐

