请解释:
我正在声明一个包含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 我的问题是为什么以及是否有充分的理由。
答案 0 :(得分:5)
这是因为3.7
字面值是double
。如果您需要float
,请使用3.7f
。在C ++中,它在标准 2.14.4浮动文字中指定。最相关的部分是
浮点文字的类型为
double
,除非后缀明确指定。后缀f
和F
指定float
,后缀l
和L
指定long double。
这不会回答为什么就是这样。我想这是因为它在C中的方式,以及它在C中的那种方式必须在某种程度上是任意的。
答案 1 :(得分:3)
这似乎至少有几个原因。
首先,PDP-11浮点单元具有单精度模式和双精度模式。可以在模式之间切换,但速度相当慢。同时,双精度模式下的执行速度几乎与单精度模式一样快(如果内存服务,在少数情况下更快)。
其次,早期的C没有办法指定函数参数类型。标准库函数只接受双精度浮点(因为它几乎免费提供了额外的精度)。编写库来处理单精度和双精度浮点会使(大约)工作量增加一倍,但没有提供真正的优势。
答案 2 :(得分:0)
默认情况下,3.7将被视为java中的double
。如果您希望将其视为float
,则需要附加f,3.7f。
答案 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!