我正在读教科书,上面写道:
默认情况下,C ++会将您在程序源代码中输入的所有浮点数(例如7.33和0.0975)视为double值。
我发现这有点奇怪,从未听说过。似乎浪费了?如果不指定,为什么要获得额外的精度?为什么有两种不同的类型意味着相同的东西?那么长的双倍呢?
答案 0 :(得分:20)
这是语言规范的一部分。如果你想要一个双,写:
auto a = 12.3;
如果你想要一个浮点数,请写:
auto a = 12.3f;
如果你想要一个长双,写:
auto a = 12.3L;
来源:MSDN
在2.14 Literals
一章的C ++标准中广泛描述了整个主题。
答案 1 :(得分:7)
这与您在代码中编写的任何整数都被视为(带符号)int
的情况相同。只要将其分配给变量,就会得到变量的类型。
但是,在计算中使用独立文字时,您将获得该计算的文字类型,可能会触发隐式类型转换:
float f = 3.141; // f is of type float, even though the literal was double
auto d = f * 2.0; // d will be of type double because of the literal 2.0
auto f2 = f * 2.0f; // f2 will be of type float again
第二行的计算涉及两种不同的类型:变量的类型 f
是float
。即使它是从double
文字构造的,变量的类型也是重要的。另一方面,文字 2.0
的类型是double
,因此会触发计算的隐式转换。因此,实际乘法作为两个double
s的乘法执行。
如果您希望独立值具有特定类型,请使用匹配的文字。
答案 2 :(得分:4)
我实际上认为书中的文字是正确的。我正在解释一下:
默认情况下,
12.3
等浮点值为double
。
换句话说,如果你没有在数字末尾添加字母“f”,那么为了使它12.3f
,它确实是一个双倍。
大多数情况下(如果浮点计算只是代码的一小部分),这没什么区别,但如果你有浮点变量,并使用double
常量进行初始化和比较,那么是float
到double
的额外转换。当然,例如,常量所需的存储量会更大。