java Float:== equals compareTo

use*_*055 1 java equals compareto

我有两个问题.

1)有人告诉我,在比较两个FloatDouble数据时,请使用compareTo而不是equals.我不知道原因.是否有任何示例显示哪些使用equals会导致错误?

2)看到这段代码:

  float f2=(float)1.123450;
  Float f3=new Float(1.123450);

  System.out.println(f3==f2);   // result is true
Run Code Online (Sandbox Code Playgroud)

我认为使用==意味着两个数据指向相同的内存地址.但这样做f3f2具有相同的地址?不new Float(...)创造新的空间?

Ted*_*opp 9

如果两个参数都是引用类型,那么==将测试内存位置.但是,如果==(或!=)的一个参数是数字而另一个可转换为数字(使用拆箱),则通过比较拆箱后的数值来完成比较.因此,在这种情况下的比较是基于浮点值(在这种情况下是相同的)来完成的.有关详细信息,请参阅Java语言规范§15.21.1.

但是请注意,这Float.NaN == Float.NaNfalse.

  • 另请注意,一般来说,您希望通过查看它们是否非常接近来比较两个浮点数/双打,而不是它们是否完全相等.这是由于浮点数可能累积的舍入误差,尤其是当十进制数不能精确表示为浮点数(例如0.1)时. (6认同)

Pet*_*rey 6

一般来说,==除非您需要处理舍入或算术错误,否则compareTo()对您没有多大帮助.

如果要比较错误,可以使用两个双打

if (Math.abs(a - b) < ERR) // within error.
Run Code Online (Sandbox Code Playgroud)

或相对错误

if (Math.abs(a - b) < ERR * (Math.abs(a) + Math.abs(b))/2) // within error.
Run Code Online (Sandbox Code Playgroud)

或者在四舍五入中,该因子通常是10000的幂,如10000意味着小数点后4位.

if (Math.round(a * factor) == Math.round(b * factor)) // within a multiple
Run Code Online (Sandbox Code Playgroud)

  • 来自[Float.equals()]的文档(http://docs.oracle.com/javase/6/docs/api/java/lang/Float.html#equals(java.lang.Object)):_"如果`f1`和`f2`都表示`Float.NaN`,则equals方法返回`true`,即使`Float.NaN == Float.NaN`的值为'false`."_ (2认同)