在施工时优于浮子

时间:2013-07-05 04:21:18

标签: java c++ constructor double

请解释:

我正在声明一个包含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 个答案:

答案 0 :(得分:5)

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

  

浮点文字的类型为double,除非后缀明确指定。后缀fF指定   float,后缀lL指定long double。

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

答案 1 :(得分:3)

这似乎至少有几个原因。

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

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

答案 2 :(得分:0)

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

请参阅java tutorialJava Language Specification

答案 3 :(得分:0)

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

double d = 3.7f;
System.out.println(d); // doesn't print 3.7 as expected!