Java 施工时双优先于浮动
请解释: 我声明了一个包含2个构造函数的类,如下所示: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
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!