5

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

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

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

为什么不能隐式地将 double 转换为 int?int x = 5.0;

4

5 回答 5

18

的范围double大于int。这就是为什么你需要明确的演员。由于同样的原因,您不能隐式转换 from longto int

long l = 234;
int x = l; // error
于 2014-10-06T02:59:51.083 回答
17

仅当您保证不会因转换而丢失数据时,才能使用隐式转换。因此,您可以将 an 强制转换为integeradouble或 an数据类型。但是,从 a转换为 an会冒丢失数据的风险。integerlongdoubleinteger

Console.WriteLine ((int)5.5);  
// Output > 5

这就是为什么微软没有为这个特定的转换编写隐式转换。相反,.NET 框架强制您使用显式转换,以确保您通过从一种类型显式转换为另一种类型来做出明智的决定。

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

来源> MSDN

于 2014-10-06T03:00:53.203 回答
4

C# 遵循 Java 的类型系统,它对类型int-> long-> float->进行排序double,并指定出现在另一个左侧的任何类型都可以转换为它。我个人认为以这种方式对类型进行排序是一个坏主意,因为这意味着与直接long l = getSomeValue(); float f=l; double d=f;存储相比,尽管精度损失严重,但类似的代码将干净地编译而不会发出尖叫声;它还有其他一些不幸的后果。ld

我怀疑 Gosling 像他所做的那样对类型进行排序,以确保将 afloat和 a传递double给一个重载(float,float)(double,double)使用后者的方法。不幸的是,他的排名有一个不幸的副作用,即将intor传递long给仅重载的方法floatdouble并将导致该方法使用float重载而不是double重载。

C# 和 .NET 遵循 Java 的领先优势,优先使用long-to-float转换而不是long-to- double;将它们从一些随之而来的方法重载恐怖中“拯救”出来的一件事是,几乎所有具有 for 重载的 .NET Framework 方法也具有 for 重载,float并且在与其他浮点类型之间不存在隐式转换。因此,尝试将 a 传递给具有、和重载但不具有重载的方法将导致编译错误,而不是转换为.doubleDecimalDecimallongfloatdoubleDecimallongfloat

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

于 2014-10-06T16:32:54.863 回答
3

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

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 的转换实际上增加了类型中的信息量,因此总是可以安全地完成。

于 2014-10-06T02:55:27.880 回答
0

当您从 DOUBLE 隐式转换为 INT 时,您正在尝试存储编号。将大内存转换为具有小内存的变量(向下转换)

双 d=4.5;

int x=d;//错误或警告

这可能很危险,因为您可能会丢失信息,例如您可能会丢失双精度数的小数部分,同时将其存储在整数中

而将 int 值存储在双变量(向上转换)中时并非如此。

诠释 x=2;

双 d=x; //正确的

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

于 2018-10-20T08:16:19.113 回答