Java 为什么可以';我是否隐式地将double转换为int?

Java 为什么可以';我是否隐式地将double转换为int?,java,c#,casting,implicit-conversion,explicit-conversion,Java,C#,Casting,Implicit Conversion,Explicit Conversion,可以将int隐式转换为double:double x=5 可以显式地将int转换为double:double x=(double)5 可以显式地将double转换为int:intx=(int)5.0 为什么不能将double隐式转换为int?:intx=5.0想象一下你有这样一段代码: double x = pi/6; double y = sin(x); 那么y将是0.5。 现在假设x被转换为整数,如下所示: int x = pi/6; double y = sin(x); 在这种情况下,

可以将int隐式转换为double:
double x=5

可以显式地将int转换为double:
double x=(double)5

可以显式地将double转换为int:
intx=(int)5.0


为什么不能将double隐式转换为int?
intx=5.0

想象一下你有这样一段代码:

double x = pi/6;
double y = sin(x);
那么y将是0.5。 现在假设x被转换为整数,如下所示:

int x = pi/6;
double y = sin(x);
在这种情况下,x将被截断为0,然后取sin(0),即y=0

这就是为什么在很多强类型语言中没有实现从double到int的隐式转换的主要原因


int到double的转换实际上增加了类型中的信息量,因此总是可以安全地完成。

double
的范围比
int
更宽。这就是为什么您需要显式强制转换。出于同样的原因,您不能将
long
隐式强制转换为
int

long l = 234;
int x = l; // error

隐式强制转换仅在保证转换不会导致数据丢失时可用。因此,您可以将
整数
强制转换为
双精度
,或将
整数
强制转换为
数据类型。但是,从
双精度
转换为
整数
会有丢失数据的风险

Console.WriteLine ((int)5.5);  
// Output > 5
这就是为什么微软没有为此特定转换编写隐式转换。NET框架强制您使用显式强制转换,以确保您通过显式地从一种类型强制转换到另一种类型来做出明智的决策

implicit关键字用于声明隐式用户定义的类型转换运算符。如果保证转换不会导致数据丢失,则使用它启用用户定义类型与另一类型之间的隐式转换。

Source

C#遵循Java的类型系统,该系统将类型
int
->
long
float
->
double
,并指定显示在另一个类型左侧的任何类型都可以强制转换为它。我个人认为以这种方式对类型进行排序是个坏主意,因为这意味着像
long l=getSomeValue()这样的代码;浮点数f=l;双d=fl
存储到
d
相比,尽管精度严重降低,但code>将干净地编译,不会发出嘎嘎声;它还有其他一些不幸的后果

我怀疑Gosling像他那样对类型进行排序是为了确保将
浮点数
双精度
传递给一个重载为
(float,float)
(double,double)
的方法将使用后者。不幸的是,他的排名有一个不幸的副作用,那就是将
int
long
传递给一个只为
float
double
重载的方法会导致该方法使用
float
重载,而不是
double
重载

C#和.NET紧随Java的脚步,更倾向于将
-to-float
转换为
-to-double
;有一件事“拯救”了它们,使它们免于方法重载带来的恐惧,那就是几乎所有的.NET Framework方法都有
float
double
的重载,也有
Decimal
的重载,并且
Decimal
和其他浮点类型之间不存在隐式转换。因此,尝试将
long
传递给具有
浮点
double
十进制
重载(而非
long
)的方法将导致编译错误,而不是转换为
浮点


顺便说一句,即使选择允许哪些隐式转换的人考虑了这个问题,也不太可能允许从浮点类型(例如,
double
)到离散类型(例如,
int
)的隐式转换。除此之外,对于生成2.999999994的计算结果,最佳整数表示形式在某些情况下为2,在其他情况下为3。在转换有时需要以一种方式进行,有时需要以另一种方式进行的情况下,通常情况下,语言要求程序员指出实际意图是好的。

当您隐式地从DOUBLE转换为INT时,您试图将内存大的no.存储到内存小的变量中(向下转换)

双d=4.5

int x=d//错误或警告

这可能是危险的,因为您可能会丢失信息,就像您可能会丢失double的小数部分而将其存储在整数中一样

然而,在双变量中存储int值(向上转换)时,情况并非如此

int x=2

双d=x//正确的


因此,编译器不允许隐式地从double转换为int(或在int中存储double值),因为有人可能会在不知情的情况下这样做,并且不希望数据丢失。但是,如果你明确地强制转换,这意味着你对编译器说,不管有什么危险,我都会设法…希望它有帮助..

语言是什么?C#还是Java。我假设大多数语言都是这样。请指定语言。只有少数语言支持这种语法和概念,更不用说它是否正确了。原因很多:bug查找、历史、数学。但可能是数学:任何整数也是实数,但不是相反。这个问题有7张赞成票和7张反对票……为什么?关于C#中的隐式强制转换,唯一一致的规则是隐式强制转换只朝一个方向进行。如果规则是隐式强制转换不能“丢失数据”,则从
int
强制转换为
float
,或从
long
强制转换为
float