Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 施工时双优先于浮动_Java_C++_Constructor_Double - Fatal编程技术网

Java 施工时双优先于浮动

Java 施工时双优先于浮动,java,c++,constructor,double,Java,C++,Constructor,Double,请解释: 我声明了一个包含2个构造函数的类,如下所示: class A { public : A (double x) {cout << "DOUBLE \n";} A (float x) {cout << "FLOAT \n";} }; 此结果以DOUBLE作为输出。 我也曾在java上尝试过这一点——同样的结果。 有人能解释为什么吗 编辑:我确实意识到double是数字的默认类型,例如3.7。我的问题是为什么以及是否有这样的理由。这是因为3.7文本是doub

请解释:

我声明了一个包含2个构造函数的类,如下所示:

class A {
public :
  A (double x) {cout << "DOUBLE \n";}
  A (float x) {cout << "FLOAT \n";}
};
此结果以DOUBLE作为输出。 我也曾在java上尝试过这一点——同样的结果。 有人能解释为什么吗


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

这是因为
3.7
文本是
double
。如果您想要
浮动
,请使用
3.7f
。在C++中,它在标准中指定为<强> 2.144浮点文字< /强>。最相关的部分是

除非由后缀显式指定,否则浮点文本的类型为
double
。后缀
f
f
指定
float
,后缀
l
l
指定长双精度


这并不能回答为什么会这样。我想这是因为C中的方式,而C中的这种方式在某种程度上一定是任意的。

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


请参阅和。

这似乎至少有几个原因

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


第二,早期的C没有指定函数参数类型的方法。标准库函数只接受双精度浮点(因为它几乎免费提供额外精度)。编写库来处理单精度和双精度浮点将(大约)增加一倍的工作量,但实际好处不大。

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

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

为什么标准件是双件而不是浮件?@RanEldan我不知道这个大会的历史。这基本上是我的想法question@RanEldan然后你应该编辑你的问题来澄清你的问题。对C的默认双精度背后的基本原理的粗略猜测:默认双精度可能会在从base-10转换为literal时减少精度损失base-2浮点。为什么默认值是double而不是float?@RanEldan:用Java语言规范参考更新了答案。我不明白你说的“默认值”是什么意思。编译器需要一种方法来区分不同类型的literal。单引号表示字符,双引号表示字符串,没有小数点的数字表示整数。带小数点的数字表示双精度,最后带小数点以f结尾的数字表示浮点。关于为什么它应该是浮点,你有什么论据吗?没有它似乎有点毫无意义。如果你不想让每个人在每件事上都加上后缀而惹恼他们,那么就必须有一些东西是默认的。
double d = 3.7f;
System.out.println(d); // doesn't print 3.7 as expected!