什么是区别?
float f = (float) 99.32 ;
float f = 99.32f ;
它们俩都编译并运行成功了。
什么是区别?
float f = (float) 99.32 ;
float f = 99.32f ;
它们俩都编译并运行成功了。
float f = 99.32f ;
那是一个 float
字面值,意味着将一个 float
变量直接赋值为一个 float
值。
float f = (float) 99.32 ;
这是一个float
变量,它被赋予一个double
值,在赋值之前将其强制转换为float
。
99.32
是一个浮点型字面量,它的类型是 double
。 - mch99.32
是一个double
类型的浮点数,而不是被隐式转换为它。这被称为“double
类型的浮点字面量”。99.32f
是一个float
类型的浮点数,也没有进行转换。这被称为“float
类型的浮点字面量”。在float f = 99.32f;
或double d = 99.32;
中没有进行转换。 - mch虽然这两种情况可能被优化掉,但是在第一种情况下,您有一个双精度字面量,它被类型转换为浮点型,而在第二种情况下,您有一个浮点字面量。
如果没有被优化掉,你会在第二个例子中的代码中得到一个类型转换。
但是,在某些边角情况下,结果可能略有不同(取决于四舍五入模式)。如果您的数字无法精确表示,那么在第一种情况下,您将获得两次舍入-首先将十进制表示舍入为双精度,然后将其舍入为浮点数,而在第二种情况下,您直接将十进制表示舍入为浮点数。
0x1.000004p-1
,而使用后缀则会得到0x1.000002p-1
(参见http://ideone.com/EV3QeG)。另请参见https://en.wikipedia.org/wiki/Rounding#Double_rounding。 - Matthieu M.0x1.000003p-1
(因此当双精度浮点数舍入为单精度浮点数时为0x1.000004p-1
),而11-16(大约是该范围的一半)的最后两位数字为0x1.000002p-1
。因此,在每个实例中可能发生这种情况的值范围(可能相隔一个浮点ULP)大约为一个双精度ULP的一半宽度,并且在每种情况下向上或向下舍入时会产生一个半浮点ULP的“误差”,因为实际值大约处于两个浮点值之间的中间位置。 - Random83299.32
被解释为 double 而不是 float。f
确保编译器将 99.32
解释为 float。float f = (float) 99.32;
" 中,字面值 "99.32
" 默认创建为 double
类型,然后强制转换为 float
类型。float f = 99.32f ;
" 中,由于 "99.32f
" 中的结尾字母 f
,字面值默认创建为 float
类型,不需要类型转换。double f = 99.32;
",因为你会直接将匹配类型的变量赋值为 double
类型。没有后缀的浮点数字面值默认为 double
类型。
因此,声明 float f = (float) 99.32;
你首先显式地将类型为 double
的数字面值 99.32
转换为 float
,然后将其赋值给变量 f
。
声明 float f = 99.32;
同样做了相同的事情,但在这种情况下,类型转换是隐式进行的。
如果您想避免隐式转换,应使用 f
后缀来定义您的数字面值(即,float f = 99.32f;
)
f
后缀,结果有时会出错。 - phuclv区别在于字面量99.32
是double类型,而字面量99.32f
是float类型。
第一条语句将float字面量分配给一个float变量。没什么特别的。
第二条语句将double字面量强制转换为float,并将结果分配给float变量。
就标准而言,您可以将double字面量分配给float变量,而不需要显式地进行强制转换。在这种情况下会发生隐式转换。例如:
float f = 99.32;
你甚至可以做到:
float f = (double) 10.5f;
右边仍然会被隐式转换为浮点数。
请注意,大多数现代编译器会优化掉这些内容,因此表示浮点数通常是风格和偏好的问题。 只要保持一致即可。
f
后缀,结果有时会出错。 始终使用 f
表示 float
,并使用 L
表示 long double
. - phuclv