2013-04-30 70 views
3

我有一個過程,返回一個浮點數到三位小數。浮點精度和刪除計劃中的舍入錯誤

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

有沒有什麼辦法可以把這個計算到3.67的Scheme?

我使用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 

無無無無我的投入!

你如何處理這種不準確?

回答

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 
+0

@ GoZoner(http://stackoverflow.com/users/1286639/gozoner)尼斯和清潔(我的是缺憾),我喜歡'(/(圓(* 100ž ))100)'擺脫了不準確性*,*是一個我可以重複使用的函數(無論我選擇哪種功能!)。把'round'改成'celing',因爲它符合我的所作所爲。 +1。 (#)( - (不精確 - >精確0.5)(不精確) - >確切0.4)(精確 - >確切0.1)))''。 – usernvk 2013-04-30 14:47:07

+1

我從來沒有使用過球拍。 '#e'閱讀器語法可能在R5RS之後。 – GoZoner 2013-04-30 15:07:41

+1

@ [GoZoner](http://stackoverflow.com/users/1286639/gozoner)+1不支持Racket。我討厭它(完全免責聲明,我是新的計劃)。 – usernvk 2013-04-30 15:43:11