Java:为什么我们需要强制转换而不是双精度?

时间:2018-08-29 03:40:32

标签: java casting double

我不知道您是否认为这是一个重要问题,但我想知道。 float是一个浮点数(4个字节)。 double是浮点数(8个字节)。 为什么我们要定义双重淘汰制:

double d = 2.1;

但是我们需要使用浮点数进行投射:

float f = (float) 2.1;

float f = 2.1f;

谢谢。

3 个答案:

答案 0 :(得分:1)

双打更精确,额外的存储成本几乎总是可以忽略不计。因此,在Java中,默认情况下2.1是双重类型。现在要将double转换为float时,您需要进行转换,而无需将double数据分配给double类型转换。

答案 1 :(得分:1)

如果浮点文字以字母Ff结尾,则其类型为float;否则,其类型为double,并且可以选择以字母Dd结尾。

浮点类型(floatdouble)也可以使用E或e(对于科学计数法),Ff(32位浮点)表示。文字)和Dd(64位双精度文字;这是默认值,按惯例省略)。

double d1 = 123.4;
// same value as d1, but in scientific notation
double d2 = 1.234e2;
float f1  = 123.4f;

See Floating-Point Literals in oracle Java Tutorial

答案 2 :(得分:1)

默认情况下,Java编译器将2.1视为double(64位)而不是float(32位)。声明float f = 2.1将导致精度损失。因此,Java迫使您进行强制转换以确保您声明的是float变量。

如果不进行强制转换,则可以在浮点数末尾使用字母“ f”来实现相同的目的。例如,float f=2.1f

现在您可能会问,为什么从long转换为float时不需要强制转换,因为前者在内部使用的位比后者更多。答案是Java不需要在扩展路径上进行强制转换-字节=>短=>整数=>长=>浮点=>双精度。 (从左到右(扩大转换)-不需要强制转换; 从右到左(变窄的转换-需要显式强制转换)

相关问题