3

为什么我必须放入f变量f

float f =5.67f;

我知道double变量可以接受更多的小数,float 但是为什么我必须在我已经说过它是变量f之后添加它?5.67float

4

8 回答 8

5

当我已经说过它是浮动变量时

你知道,编译器不会double- 它会尝试从to进行隐式转换,float因为默认情况下5.67被解释为 a double


当您编写时float f = 5.67;,编译器不知道这5.67是 afloat而不是 adouble因为默认类型5.67a double

float比不能进行隐式转换精确,并且会产生错误“类型不匹配:无法从双精度转换为浮点”。double

于 2013-11-06T11:09:47.237 回答
2

来自文章 http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

浮点文字

如果浮点字面量以字母 F 或 f 结尾,则它的类型为 float;否则它的类型是 double 并且可以选择以字母 D 或 d 结尾。

The floating point types (float and double) can also be expressed using E or e
(for scientific    notation), F or f (32-bit float literal) and D or d (64-bit double literal; 
this is the default and by convention is omitted).

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

浮点数和双精度数的区别:

float:float 数据类型是单精度 32 位 IEEE 754 浮点数。它的值范围超出了本讨论的范围,但在 Java 语言规范的浮点类型、格式和值部分中指定。与 byte 和 short 的建议一样,如果您需要在大型浮点数数组中节省内存,请使用浮点数(而不是双精度数)。此数据类型绝不应用于精确值,例如货币。为此,您需要改用 java.math.BigDecimal 类。Numbers and Strings 涵盖了 Java 平台提供的 BigDecimal 和其他有用的类。

double:双精度数据类型是双精度 64 位 IEEE 754 浮点数。它的值范围超出了本讨论的范围,但在 Java 语言规范的浮点类型、格式和值部分中指定。对于十进制值,此数据类型通常是默认选择。如上所述,这种数据类型不应该用于精确值,例如货币。`

于 2013-11-06T11:19:29.783 回答
2

在 Java 中,缩小原始转换(例如double-> float)只能显式应用。当您编写时,float f = 5.67;您期望转换隐式发生,因此您会收到错误。Java 将所有浮点字面量定义为double类型,而不管有效数字的数量。指定float文字的唯一方法是将f或附加F到数字。

于 2013-11-06T11:14:37.553 回答
0

该值为5.67双精度(Java 类型double)。

该值为5.67f单精度(Java 类型float)。

所以float f = 5.67;首先创建一个双精度值,然后尝试将它存储在一个单精度变量中。

当您尝试将双精度值存储在单精度变量中时,编译器会反对,因为您(可能并且通常)会丢失信息。

您可以使用类型转换,这是当值不是文字时所做的:

float f = (float)5.67;

但在这种情况下,首先将文字设为浮点数而不是双精度会更简单:

float f = 5.67f;
于 2013-11-06T11:30:33.380 回答
0

您已经说过 f 是一个浮点数,但文字 5.67 默认是双精度数,您必须另外声明。

就像SomeObject o =new SomeObject();两者都需要同意(或能够被转换)一样。双精度不能自动转换为浮点数,因此您必须明确地说 5.67 是浮点数而不是双精度数。

于 2013-11-06T11:13:28.603 回答
0

后缀告诉编译器如何解释该值。编译器会将 5.67 视为双精度,因为这是默认行为。f 告诉编译器将其视为浮点数。

于 2013-11-06T11:12:34.357 回答
0

因为您可以通过计算来初始化变量:例如 double d = 5.4f / 2f。

于 2013-11-06T11:12:49.953 回答
0

正如这里已经回答的那样, 5.67f 是浮点文字的语法,而 5.67 是双精度文字。

将浮点值分配给双精度变量需要显式强制转换(否则您会得到“可能的精度损失”编译时错误),因此您必须编写:

float f = 5.67f;

或者:

float f = (float)5.67;
于 2013-11-06T11:15:21.523 回答