为什么Float静态比较不需要epsilon值?

Bic*_*ick 0 java floating-point comparison epsilon

检查Float.compare(f1,f2)后,我发现它比较f1f2
并返回-1,0,1.

然后,如果值为-0.0,0.0或NAN,则返回-1,0,1.
这是什么意思-0.0?

我会期待类似的东西

 return (Math.abs(f1 - f2) - 0.001f) > 0) 
Run Code Online (Sandbox Code Playgroud)

其中0.001是给定的epsilon值.
谢谢.

NPE*_*NPE 10

-0.0是否为零,由IEEE 754标准规定.

如果您对如何产生这样的价值感到好奇,下面的文章很好地解释了它:http://www.savrola.com/resources/negative_zero.html

至于不采用epsilon值,这就是Float.compare设计工作的方式(这是一个精确的比较,而不是近似的比较).没有什么可以由具有一定另一个比较函数阻止你采取ε和执行近似的比较.

浮点数的精确和近似比较都有其用途.

至于你的实际代码,它遇到了很多问题:

  1. 这不是一个三向比较Float.compare;
  2. 它不处理NaNs;
  3. 通常最好将epsilon指定为相对值,而不是绝对值,以便将其与(f1f2参阅本文讨论)进行比较.

我的观点不是要批评你的代码,而是要表明编写好的浮点代码比它最初看起来更难.