2

请解释:

我正在声明一个具有 2 个构造函数的类,如下所示:

class A {
public :
  A (double x) {cout << "DOUBLE \n";}
  A (float x) {cout << "FLOAT \n";}
};

然后:

A a (3.7);

此结果以DOUBLE作为输出。我也在java上试过这个 - 结果相同。谁能解释为什么?

编辑:我确实意识到 double 是数字的默认类型,例如3.7我的问题是为什么以及是否有充分的理由。

4

4 回答 4

5

这是因为3.7文字是double. 如果需要float,请使用3.7f. 在 C++ 中,它在标准2.14.4 Floating Literals中指定。最相关的部分是

double除非由后缀明确指定,否则浮动文字的类型。后缀fF指定 float,后缀lL指定long double。

这没有回答为什么会这样。我想这是因为它在 C 中的方式,以及它在 C 中的方式在某种程度上必须是任意的。

于 2013-07-05T04:22:00.067 回答
3

这似乎至少有几个原因。

首先,PDP-11浮点单元有单精度模式和双精度模式。模式之间的切换是可能的,但相当慢。同时,双精度模式下的执行速度几乎与单精度模式下一样快(如果有内存,在少数情况下甚至更快)。

其次,早期的 C 没有办法指定函数参数类型。标准库函数只接受双精度浮点(因为它几乎免费提供额外的精度)。编写库来处理单精度和双精度浮点数将(大约)加倍努力,但几乎没有提供真正的优势。

于 2013-07-05T05:34:02.210 回答
0

默认情况下,3.7 将被视为double在 java 中。如果您希望将其视为float,则需要附加 f, 3.7f。

请参考java 教程Java 语言规范

于 2013-07-05T04:22:56.103 回答
0

浮点数没有精确的表示。这意味着 3.7d != 3.7f 因为它们具有不同的精度。由于 3.7d 具有更高的精度,因此默认值 3.7 是一个更好的选择。如果您使用 3.7f 您可以将其分配给 adouble并且不知道这缺乏双精度,例如

double d = 3.7f;
System.out.println(d); // doesn't print 3.7 as expected!
于 2013-07-05T06:09:33.070 回答