当我在球拍中尝试以下操作时:
(* 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
哦,看,这比较正确!
> (= (* #e1.1 #e1.1) #e1.21)
#t
(Racket 有这个非常好的特性,#e1.1
实际上在 1.1 中被准确地读入。其他 Scheme 实现不一定以这种方式工作,实际上可能#e1.1
首先作为浮点读入,然后转换为精确值。)
无论如何,为了详细说明其他人的观点,在没有精确说明符的情况下,Scheme 将带有点的数字文字视为不精确†</sup> (也就是说,1.1
读#i1.1
入相同的东西)。对于不精确的数字,在进行“精确”比较(例如 )时,您不能真正期待理智的结果=
。
†</sup> R7RS,第 6.2.5 节:“如果数字的书面表示没有精确前缀,则如果常数包含小数点或指数,则该常数是不精确的。否则,它是精确的。”