当我在球拍中尝试以下内容时:
(* 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
答案 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节:“如果数字的书面表示没有精确性,那么如果常量包含小数点或指数,则常量是不精确的。否则,它是精确的。“