15

As it states from oracle

Reference from Oracle Docs

Widening Primitive Conversion 19 specific conversions on primitive types are called the widening primitive conversions:

  1. byte to short, int, long, float, or double
  2. short to int, long, float, or double
  3. char to int, long, float, or double
  4. int to long, float, or double
  5. long to float or double?
  6. float to double

If a float has 32 bits and a long has 64 how is that considered widening? Shouldn't this be considered narrowing?

4

4 回答 4

25

afloat或可以表示的值double的范围远大于 a 可以表示的范围long。尽管从 a 转换为 a 时可能会丢失有效数字longfloat但它仍然是一种“扩大”操作,因为范围更广。

来自Java 语言规范,§5.1.2

int 或 long 值到 float 或 long 值到 double 的扩大转换可能会导致精度损失 - 也就是说,结果可能会丢失值的一些最低有效位。在这种情况下,生成的浮点值将是整数值的正确舍入版本,使用 IEEE 754 舍入到最近模式(第 4.2.4 节)。

请注意,adouble可以准确地表示每个可能的int值。

于 2013-03-05T16:41:31.357 回答
3

它被认为是加宽的,因为可以用浮点数表示的数字大于可以用 long 表示的数字。仅仅因为 float 使用 32 位精度并不意味着它可以表示的数字仅限于 2^32。

例如,浮点数(float)Long.MAX_VALUE+(float)Long.MAX_VALUE大于Long.MAX_VALUE,即使浮点数的精度低于 long。

于 2013-03-05T16:42:35.210 回答
2

它被认为是扩大,因为floatdouble可以表示比 更大的值long。您可能会失去精度,但可以(至少近似地)表示该值。

于 2013-03-05T16:41:56.993 回答
1

如果你用简单的术语来看这个问题,它是关于 原始设计者如何表示数据的。

理想情况下,long(64) 的位深度大于 float(32)。但是浮点数据使用科学概念 表示,这允许表示更大的范围

例:300【原数】:3×102【科学表示】


长:-2^63 到 2^63-1

浮点数:(-3.4)*10^38 到 (3.4)*10^38

请注意这里的 Long(2 的幂)与 Float(10 的幂)的表示差异,这允许 float 具有更高的范围

希望这会有所帮助

于 2018-04-03T06:37:36.623 回答