我有一个将浮点值返回到小数点后三位的过程。
>(gpa ’(A A+ B+ B))
3.665
有没有办法把这一数字提高到3.67呢?
我将SCM版本5e7与Slib 3b3、附加的Simply Schemelibraries(simply.scm、functions.scm、ttt.scm、match.scm、database.scm)和我使用的已加载的应答库一起使用。
作为旁白,我今早把这个输入我的电脑
> (* 1 (- 0.5 0.4 0.1))
-27.755575615628913e-18
不不不!
你怎么处理这种不准确的地方?
最佳答案
试用
(define (round-off z n)
(let ((power (expt 10 n)))
(/ (round (* power z)) power)))
> (round-off 3.665 2)
3.66
> (round-off 3.6677 2)
3.67
注3.665至3.66,而非3.67(平分向下;赔率向上)
至于你的第二个问题。使用精确的数字:
> (* 1 (- #e0.5 #e0.4 #e0.1))
0
> #e0.5
1/2
关于floating-point - 浮点精度和消除方案中的舍入误差,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16302038/