关系运算符以何种方式不遵守具有浮点值的compareTo契约?

Joh*_*0te 11 java floating-point compare compareto

引自Jos Java Bloch的Effective Java - Second Edition

对于浮点字段,请使用Double.compare或Float.compare代替关系运算符,这些运算符在应用于浮点值时不遵守compareTo的常规协定.

它没有详细说明为什么会这样.

所以,我的问题是:

当与浮点值一起使用时,关系运算符以何种方式不遵守compareTo的一般约定?

Kie*_*old 6

来自javadoc:

 public int compareTo(Double anotherDouble)
Run Code Online (Sandbox Code Playgroud)

以数字方式比较两个Double对象.当应用于原始double值时,此方法执行的比较有两种方式与Java语言数值比较运算符(<,<=,==,> =,>)执行的比较不同:Double.NaN由此考虑方法等于自身并且大于所有其他double值(包括Double.POSITIVE_INFINITY).该方法认为0.0d大于-0.0d.这确保了此方法强加的Double对象的自然顺序与equals一致.