为什么我不能隐式地将double转换为int?

时间:2014-10-06 02:44:17

标签: java c# casting implicit-conversion explicit-conversion

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

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

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

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

5 个答案:

答案 0 :(得分:17)

只有当您确保转换后不会发生数据丢失时,才能使用隐式转换。因此,您可以将integer转换为double,或integer转换为long数据类型。但是,从double转换为integer会冒丢失数据的风险。

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

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

  

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

来源> MSDN

答案 1 :(得分:16)

double的范围宽于int。这就是你需要明确演员的原因。由于同样的原因,您无法隐式地从long投射到int

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

答案 2 :(得分:4)

C#遵循Java类型系统的主导,它对类型int - > long - > float - > double进行排名,并指定任何类型看起来在另一个人的左边可能会被投射到它。我个人认为这种方式的排名类型是一个坏主意,因为它意味着像long l = getSomeValue(); float f=l; double d=f;这样的代码可以干净地编译而不会发出尖叫声,尽管与将l直接存储到{{1}相比会严重损失精确度};它还有一些其他不幸的后果。

我怀疑Gosling按照他的方式对类型进行了排名,以确保将dfloat传递给double(float,float)重载的方法使用后者。不幸的是,他的排名有一个不幸的副作用,即将(double,double)int传递给仅为longfloat重载的方法将导致该方法使用double重载而不是float重载。

C#和.NET遵循Java的优势,更倾向于double - { - {}}转换long - 至 - float;从一些随之而来的方法重载恐怖中“拯救”它们的一件事是几乎所有带有longdouble重载的.NET Framework方法都有float的重载,double和其他浮点类型之间不存在隐式转换。因此,尝试将Decimal传递给具有Decimallongfloat但不是double重载的方法将导致编译错误而不是转换为Decimal

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

答案 3 :(得分: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实际上会增加该类型中的信息量,因此可以始终安全地完成。

答案 4 :(得分:0)

当您从双转换为隐式时,您将尝试存储一个。将具有大内存的内存转换为具有小内存的变量(向下转换)

  

双倍d = 4.5;

     

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

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

而将int值存储在双精度变量中(向上转换)则不是这种情况。

  

int x = 2;

     

double d = x; //正确

因此,编译器不允许将double隐式转换为int(或将double值存储在int中),因为有人可能会在不知不觉中这样做,并且不会丢失任何数据。但是,如果您明确地进行强制转换,则意味着您对强制转换的编译器说了什么,无论如何,我都会设法....希望它会有所帮助。