为什么我必须放入f
变量f
?
float f =5.67f;
我知道double
变量可以接受更多的小数,float
但是为什么我必须在我已经说过它是变量f
之后添加它?5.67
float
为什么我必须放入f
变量f
?
float f =5.67f;
我知道double
变量可以接受更多的小数,float
但是为什么我必须在我已经说过它是变量f
之后添加它?5.67
float
当我已经说过它是浮动变量时
你知道,编译器不会double
- 它会尝试从to进行隐式转换,float
因为默认情况下5.67
被解释为 a double
。
当您编写时float f = 5.67;
,编译器不知道这5.67
是 afloat
而不是 adouble
因为默认类型是5.67
a double
!
float
比不能进行隐式转换更精确,并且会产生错误“类型不匹配:无法从双精度转换为浮点”。double
来自文章 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 语言规范的浮点类型、格式和值部分中指定。对于十进制值,此数据类型通常是默认选择。如上所述,这种数据类型不应该用于精确值,例如货币。`
在 Java 中,缩小原始转换(例如double
-> float
)只能显式应用。当您编写时,float f = 5.67;
您期望转换隐式发生,因此您会收到错误。Java 将所有浮点字面量定义为double
类型,而不管有效数字的数量。指定float
文字的唯一方法是将f
或附加F
到数字。
该值为5.67
双精度(Java 类型double
)。
该值为5.67f
单精度(Java 类型float
)。
所以float f = 5.67;
首先创建一个双精度值,然后尝试将它存储在一个单精度变量中。
当您尝试将双精度值存储在单精度变量中时,编译器会反对,因为您(可能并且通常)会丢失信息。
您可以使用类型转换,这是当值不是文字时所做的:
float f = (float)5.67;
但在这种情况下,首先将文字设为浮点数而不是双精度会更简单:
float f = 5.67f;
您已经说过 f 是一个浮点数,但文字 5.67 默认是双精度数,您必须另外声明。
就像SomeObject o =new SomeObject();
两者都需要同意(或能够被转换)一样。双精度不能自动转换为浮点数,因此您必须明确地说 5.67 是浮点数而不是双精度数。
后缀告诉编译器如何解释该值。编译器会将 5.67 视为双精度,因为这是默认行为。f 告诉编译器将其视为浮点数。
因为您可以通过计算来初始化变量:例如 double d = 5.4f / 2f。
正如这里已经回答的那样, 5.67f 是浮点文字的语法,而 5.67 是双精度文字。
将浮点值分配给双精度变量需要显式强制转换(否则您会得到“可能的精度损失”编译时错误),因此您必须编写:
float f = 5.67f;
或者:
float f = (float)5.67;