为什么(* 1.1 1.1)在球拍中是1.2100000000000002?

时间:2013-08-26 03:32:49

标签: scheme racket

当我在球拍中尝试以下内容时:

(* 1.1 1.1)

为什么会返回

1.2100000000000002

而不是

1.21

(* 1.2 1.2) ; is 1.44, as expected

修改

,以下内容返回false:

(= (* 1.1 1.1) 1.21); #f

1 个答案:

答案 0 :(得分:9)

哦,看,这比较正确!

> (= (* #e1.1 #e1.1) #e1.21)
#t

(Racket有一个非常好的功能,#e1.1实际上只是读入1.1。其他Scheme实现不一定以这种方式工作,实际上可能在#e1.1读取浮点数并且然后转换为精确。)

无论如何,为了详细阐述其他人的观点,如果没有精确性说明符,Scheme会将带有点的数字文字视为不精确的(即1.1和{{1读入同样的东西)。并且由于数字不准确,在进行“精确”比较(例如#i1.1)时,您无法真正期待合理的结果。

R7RS,第6.2.5节:“如果数字的书面表示没有精确性,那么如果常量包含小数点或指数,则常量是不精确的。否则,它是精确的。“