Java:为什么我们需要铸造浮点数而不是双精度?



我不知道你是否认为这是一个重要的问题,但我想知道。 浮点数是一个浮点数(4 个字节(。 双精度是一个浮点数(8 个字节(。 为什么我们定义双出铸造:

double d = 2.1;

但是我们需要用浮点数进行铸造:

float f = (float) 2.1;

float f = 2.1f;

提前谢谢你。

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

无需强制转换,则可以在浮点数末尾使用字母"f"实现相同的效果。例如,float f=2.1f.

现在你可能会问,为什么在从长型转换为浮点数时不需要强制转换,因为前者在内部比后者使用更多的位。答案是 Java 不需要在拓宽路径上进行转换 - 字节 => 短 => int => 长 => 浮点数 => 双精度。 (从左到右(加宽转换( - 不需要强制转换; 从右到左(缩小转换( - 需要显式强制转换(

双打更精确,额外的存储成本几乎总是可以忽略不计。所以在Java中默认2.1是双精度类型。现在要将双精度转换为浮点数,您需要强制转换,而不需要将双精度数据分配给双精度类型转换。

如果浮点文字以字母Ff结尾,则为浮点文本类型;否则其类型为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;

请参阅 Oracle Java 教程中的浮点文字

最新更新