我试图在Java
中编译以下代码(只是一个代码段):
class MyClass{
public float get100(){
return 100.05; // returning 100.05f should work
}
}
但正如您可以看到100.5
本质上是double
但get100()
通过声明返回float
,javac
会出现错误:{{ 1}}。
这完全可以理解。但这是我注意到的can't convert double to float
我尝试了以下代码(几乎与上面提到的相似):
c++
此代码在#include<iostream>
using namespace std;
class MyClass{
public:
float get100(){
return 100.05;
}
};
int main(){
MyClass m;
cout<<m.get100()<<endl;
return 0;
}
..
谁能告诉我为什么会这样?或者它是否意味着c++
编译器足够聪明,它可以自动将c++
转换为double
?
但由于float
的范围高于double
,如何在float
中工作?
任何帮助/建议表示赞赏。提前致谢。
答案 0 :(得分:3)
是的,C ++编译器非常智能,它可以自动将double转换为float。 Java编译器可以做同样的事情,但是Java的设计者决定最好不允许它,以防程序员犯了错误。
答案 1 :(得分:2)
cppreference.com on implicit conversions:
浮点转换
浮点类型的prvalue可以转换为任何其他浮点类型的prvalue。如果转化列在浮点促销下,则为促销而非转化。
如果源值可以在目标类型中准确表示,则不会更改。
如果源值在目标类型的两个可表示值之间,则结果是这两个值之一(它是实现定义的那个)
否则,行为未定义。
这里,案例是第二条规则。 100.05
并不能完全代表float
或 a double
。对于0.375
或34
等值,将应用第一个规则,因为源值可以准确表示。
对于Java,return
是一个赋值上下文。 JLS§5.2州:
分配上下文允许使用以下之一: *身份转换(§5.1.1) *扩大原始转换(第5.1.2节) *扩大参考转换(第5.1.5节) *一个拳击转换(§5.1.7),可选地后跟一个加宽的引用转换 *一个拆箱转换(第5.1.8节),可选地后跟一个加宽的基元转换。
请注意,此处允许隐式缩小转换 ,除非返回的值是常量值(即编译器可以评估的最终字段或文字表达式)。