4

你可以一个int隐式转换为双:double x = 5;为什么我不能隐式地将double转换为int?

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

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

为什么能你是否将一个double隐式转换为一个int?int x = 5.0;

+2

什么语言? – 2014-10-06 02:45:14

+0

C#或Java。我认为大多数语言都是如此。 – Evorlor 2014-10-06 02:46:29

+1

指定语言。只有几种语言支持这种语法和概念,更不用说它是否属实。 – 2014-10-06 02:49:44

回答

16

double的范围比int宽。这就是为什么你需要明确演员。由于同样的原因,你不能隐式地从long转换为int

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

当然!谢谢!!现在很明显! – Evorlor 2014-10-06 03:00:32

+4

原因可能与撰写明确的转换表达,表明您已经同意可能会丢失数据 – Machinarius 2014-10-06 19:29:29

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

16

隐式转换仅可当你保证数据的丢失不会发生作为转换的结果。因此,您可以将integer转换为doubleinteger转换为long数据类型。然而,从double投射到integer会带来丢失数据的风险。

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

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

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

来源>MSDN

+1

约在C#中的隐式转换的唯一一致的规则的事实相关联的是,隐式转换只在一个方向走。如果规则是隐式转换不能“丢失数据”,那么将禁止从“int”转换为“float”或从“long”转换为“float”或“double”,因为这些转换可能会返回舍入结果。之间的差的'float'到'int'铸造和一个“任意数量的” -to-'float' - 或'double'铸造是'float'和'double'通常* *预期代表值已经受到一些舍入,而'int','long'等应该表示离散量。 – supercat 2014-10-06 16:12:23

+0

如果这个人得到了更多的赞扬,那么对于未来的搜索者来说,不正确的答案是 – Evorlor 2014-10-08 16:59:01

4

C#遵循Java的类型系统,居各类铅int - >long - >float - >double,并指定这似乎左侧任意类型另一个可能会投给它。我个人认为以这种方式排名类型是一个坏主意,因为这意味着像long l = getSomeValue(); float f=l; double d=f;代码编译干净,尽管没有精确严重的损失直接存储到l相比d一个发牢骚;它也有其他不幸的后果。

我怀疑高斯林名列类型,他为了做保证传递floatdouble到超载为(float,float)(double,double)将使用后者的方法。不幸的是,他的排名有一个不幸的副作用,即将一个intlong传递给一个只有超载的方法,因为floatdouble将导致该方法使用超载而不是double过载。

C#和.NET遵循Java的铅在long至 - double宁愿一个long至 - float转换;有一两件事,从一些随之而来的方法超载恐怖的“拯救”他们的是,几乎所有重载floatdouble .NET框架的方法也有一个过载Decimal,并且Decimal和其他浮动之间不存在隐式转换点类型。因此,尝试将long传递给过载为float,doubleDecimal而不是long的方法将导致编译错误,而不是转换为float。顺便提一下,即使选择允许隐式转换的人更多地考虑了这个问题,也不可能允许从浮点类型(例如double)到离散类型(例如int)的隐式转换。除此之外,对于在某些情况下产生2.9999999999994将一个计算的结果最好的整数表示是2,而在其他情况下,这将是三,在转换有时可能需要做的一种方式,有时其他情况下,这种语言通常要求程序员指出实际意图。

相关问题