除以2乘以0.5乘以

Max*_*Max 10 c#

考虑以下:

void Foo(int start, int end)
{
    int mid = (start + end) / 2;
}

void Bar(int start, int end)
{
    int mid = (start + end) * 0.5;
}
Run Code Online (Sandbox Code Playgroud)

为什么Foo编译成功而不成功Bar?除以2隐式方式将结果转换为一段int时间乘以0.5得到的未转换double:

无法将类型'double隐式转换为int.存在显式转换(您是否错过了演员?)

这背后的C#语言设计师的推理是什么?

Mih*_*eac 10

所述/确实整数除法(5/3 = 1).要使它执行浮点除法,其中一个操作数必须是浮点(floatdouble).这是因为有些情况下您的应用程序想要访问商或部门的其余部分(对于您使用的其余部分%).此外,整数除法比浮动除法更快.

另一方面,乘以浮点数总是会返回一个浮点数.要将其保存为整数类型,您必须自己进行类型转换.浮点值在内存中具有不同的表示,并且还可能导致精度损失.

几乎所有编程语言都是一样的:几乎所有编程语言都有整数除法和浮点除法,更常用的是同一个算子.几乎所有类型语言都需要从浮点到整数类型的转换.


Szy*_*mon 5

答案在C#文档中.关于/运营商,它说

除以两个整数后,结果始终为整数.例如,7/3的结果是2.

乘法运算符没有这种行为,因此乘以double会产生一个double(整数可以在乘法之前隐式转换,因为它是一个加宽的类型转换).结果不能隐式转换,因为它将是缩小类型转换.