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

muy*_*ueh 4 scheme racket

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

(* 1.1 1.1)
Run Code Online (Sandbox Code Playgroud)

为什么会回来

1.2100000000000002
Run Code Online (Sandbox Code Playgroud)

代替

1.21
Run Code Online (Sandbox Code Playgroud)

(* 1.2 1.2) ; is 1.44, as expected
Run Code Online (Sandbox Code Playgroud)

编辑

并且以下返回false:

(= (* 1.1 1.1) 1.21); #f
Run Code Online (Sandbox Code Playgroud)

Chr*_*ung 9

哦,看,这比较正确!

> (= (* #e1.1 #e1.1) #e1.21)
#t
Run Code Online (Sandbox Code Playgroud)

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

无论如何,阐述其他人的角度来看,没有一个精确符,计划把一些文字与一个句点不精确(即1.1#i1.1为同样的事情读取).并且由于数字不准确,在进行"精确"比较(例如=)时,您无法真正期待理智的结果.

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