为什么以下Clojure代码打印" true"?
(请注意,最后一位数字不同)
(== (Math/sqrt 10252519345963644753026N)
(Math/sqrt 10252519345963644753025N))
不确定这个问题是关于Clojure还是它也适用于其他语言(Java' BigInteger?)。
打印它们导致:
(str (Math/sqrt 10252519345963644753026N) " "
(Math/sqrt 10252519345963644753025N))
1.01254725055E11 1.01254725055E11
答案 0 :(得分:6)
Java Math.sqrt
函数
double
参数和double
结果。正如各种评论所暗示的那样,这导致的转换失去了区分数字的精确度。事实上,转换为double
会这样做:
(= (double 10252519345963644753026N)
(double 10252519345963644753025N))
;true
double
具有53位精度。由于10位是大约3个十进制数字,因此大约是16位十进制数字。您的号码长度为23位,因此最后几位数字在转换时会丢失。