0

如果将以下数据类型转换为Double.equals()测试)或double==测试),相等测试的准确性是多少?

  • Long
  • long
  • Integer
  • int

如果等式检验仅在可能的Long、或值范围内准确long,那么该准确度的准确范围是多少?Integerint

例如;

Long longTest = Long.MAX_VALUE;
Long longTest2 = Long.MAX_VALUE;
double doubleTest = (double) longTest;
double doubleTest2 = (double) longTest2;
if(doubleTest == doubleTest2) //Is this accurate? 
     return true;
4

3 回答 3

0

考虑如下:

double 和 long 都占用 64 位存储空间。对于 float 和 int,它是 32。

因为在指数上花费了一些位,所以在将 long 转换为 double 或将 int 转换为 float 时,您总是有失去精度的危险。

唯一可以保存的是 int -> double。

无论如何,就您的示例而言:由于上述原因,双精度不能以绝对精度保存 Long.MAX_VALUE。这将是一个近似值。但是,每次的近似值都应该相同,因此您的示例应该返回 true。

于 2013-10-30T16:03:09.963 回答
0

尽管 Java 的创建者可能已经==为所有数字类型组合定义了重载,以便只有具有相同数值的事物才能比较相等 [例如,这意味着没有任何float值可以比较等于 16777217 ],或者禁止==在该运算符不会表现为等价关系的任何类型组合上使用,他们都没有做那些事情。相反,他们认为应该可以将操作数与原始类型的任何组合进行比较,无论这是否有意义,并且此类比较应该使用与任何其他上下文中存在的相同的隐式转换(我真的不喜欢这个决定,顺便说一句) .

因此,例如along和a之间的比较float将通过执行近似转换float和比较来执行,而不考虑在转换中是否丢失任何精度。float和之间的比较double将通过执行精确转换double并比较来完成。这导致 16777216.0f == 16777217 和 16777217 == 16777217.0,但 167772176.0f != 16777217.0。有时可能想知道 是否float是另一个值的最佳 float表示,有时可能想知道它是否是精确表示,但 Java 中的类型排名与==运算符回答的问题不一致。

于 2013-10-30T16:54:21.250 回答
0

几个案例...

如果这两种类型都是包装器,equals 总是精确的 - 但请注意 equals 是类型敏感的(例如 Integer.equals(Long) 总是产生 false,无论值如何)。否则...

如果一种类型是包装器而另一种是原始类型,则包装器将被拆箱并使用 == 语义完成比较,因为这两种类型从一开始就是原始类型。

对于任何整数类型(byte、short、int、long),基元的相等性(==)都是精确的——较小的类型将被转换为较大的类型,然后进行比较。对于 char,它转换为更大的类型但unsigned

一个操作数等于浮点类型(float,double),另一种类型被强制转换为浮点类型,在这种情况下可能会丢失精度。Float 可以精确地表示具有 <= 24 个有效位的任何整数值,double 具有 53 位的相关精度(它由类型中的尾数位数决定,有关脏细节,请参见 IEEE754)。

所以基本上,float == (int) N 只有在(大约)abs(N) <= (1 << 23) 时才是精确的,而当 abs(N) <= (1 << 52) 时 double = (long) N 才是精确的)。如果整数类型中有更多有效位,则在将类型转换为 float/resp 时会丢失最低位。双倍的。由于 double 的尾数位多于 int 的有效位,因此 double 和 int 之间的比较在这方面是精确的。

于 2013-10-30T17:08:42.037 回答