浮点精度与删除方案中的舍入误差

时间:2013-04-30 14:12:23

标签: floating-point lisp scheme rounding precision

我有一个将float返回到三位小数的过程。

>(gpa ’(A A+ B+ B))
3.665

有没有什么办法可以在Scheme中将其舍入到3.67?

我正在使用SCM版本5e7和Slib 3b3,附加Simply Scheme libraries(simple.scm,functions.scm,ttt.scm,match.scm,database.scm )和我使用的答案库。

顺便说一句,我今天早上把它输入我的电脑

> (* 1 (- 0.5 0.4 0.1))
-27.755575615628913e-18

不不不不!

你如何处理这种不准确的行为?

1 个答案:

答案 0 :(得分:5)

尝试

(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。 (Evens四舍五入;赔率上升)

至于你的第二个问题。使用确切的数字:

> (* 1 (- #e0.5 #e0.4 #e0.1))
0

> #e0.5
1/2