C# 为什么两个整数之间的除法结果会被截断?

C# 为什么两个整数之间的除法结果会被截断?,c#,algorithm,int,double,C#,Algorithm,Int,Double,所有有经验的C#(我认为这是C语言)程序员都习惯于对除法中的整数进行强制转换,以得到十进制/双精度/浮点结果,而不是int(实际结果被截断) 我想知道为什么要这样实施?如果两个数字都是整数,是否有理由截断结果?是,如果最终结果需要是整数。这将取决于要求 如果这些确实是您的需求,那么您就不希望存储一个小数然后截断它。要完成一些已经内置的功能,将浪费内存和处理时间。对整数进行计算(通常)比对浮点值进行计算更快。此外,所有其他整数/整数操作(+,-,*)都返回一个整数 编辑: 根据OP的要求,这里有一

所有有经验的C#(我认为这是C语言)程序员都习惯于对除法中的整数进行强制转换,以得到十进制/双精度/浮点结果,而不是int(实际结果被截断)


我想知道为什么要这样实施?如果两个数字都是整数,是否有理由截断结果?

是,如果最终结果需要是整数。这将取决于要求


如果这些确实是您的需求,那么您就不希望存储一个小数然后截断它。要完成一些已经内置的功能,将浪费内存和处理时间。

对整数进行计算(通常)比对浮点值进行计算更快。此外,所有其他整数/整数操作(
+
-
*
)都返回一个整数

编辑: 根据OP的要求,这里有一些补充:

OP的问题是,他们认为
/
是数学意义上的除法,语言中的
/
操作符执行一些其他操作(这不是math.division)。根据这一逻辑,他们也应该质疑所有其他操作(
+
-
*
)的有效性,因为这些操作具有特殊的溢出规则,这与数学对应操作的预期不同。如果这对某人来说很麻烦,他们应该找到另一种语言,在这种语言中,操作会按照此人的预期执行

至于性能差异主张支持整数值:当我写答案时,我只有“民间”知识和“直觉”来支持这一主张(hece我的“通常”免责声明)。事实上,正如Gabe所指出的那样,有些平台不具备这种能力。另一方面,我发现这一点(第12点)在Intel平台上表现出混合的性能(尽管使用的语言是Java)


需要注意的是,在性能方面,许多断言和直觉在被测量并发现为真之前都是没有根据的。

如果你将一个int加上一个int,你期望得到一个int。如果你将一个int减去一个int,你期望得到一个int。如果你将一个int乘以一个int,你期望得到一个整数。那么,如果你用整数除以整数,为什么你不期望得到一个整数结果呢?如果你期望一个int,那么你必须截断

如果你不想这样,那么你需要先把你的兴趣转移到别的东西上


编辑:我还要指出,如果你真的想理解为什么会这样,那么你应该开始研究二进制数学是如何工作的,以及它是如何在电子电路中实现的。当然没有必要详细了解它,但是快速了解它将真正帮助您了解硬件的低级细节如何过滤到高级语言的细节。

该操作符被设计为返回与其输入相同的类型

编辑(评论回复): 为什么?我不设计语言,但我会假设在大多数情况下,您将坚持最初使用的数据类型,在剩余的实例中,您将使用什么标准来自动假定用户想要哪种类型?当您需要字符串时,您会自动期望它吗?(有意)

如果两个数字都是整数,有什么好的理由截断结果吗

当然,;我可以很容易地想到十几个这样的场景。例如:您有一个较大的图像,并且图像的缩略图版本在两个维度上都要小10倍。当用户单击大图像中的某个点时,您希望在缩小的图像中识别相应的像素。显然,要这样做,需要将x和y坐标除以10。为什么要得到十进制的结果?对应的坐标将是缩略图位图中的整数坐标

对于物理计算来说,双精度很好,对于金融计算来说,小数也很好,但是我在计算机上做的几乎所有的工作都是用整数来完成的。我不希望仅仅因为我做了一些除法,就不断地把双精度或小数转换回整数。如果你在解决物理或金融问题,那么你为什么要首先使用整数?只使用双精度或小数。使用整数来解决有限的数学问题。

C#可以追溯到C,所以“为什么C#中是这样?”的答案是“为什么C中是这样?”和“没有好的理由改变吗?”

C语言的方法是在高级语言和低级操作之间有相当密切的对应关系。处理器通常将整数除法作为返回商和余数来实现,这两者都与操作数的类型相同

(所以我的问题是,“为什么在类C语言中整数除法不返回两个整数”,而不是“为什么它不返回浮点值?”)

解决方案是为除法和余数提供单独的操作,每个操作返回一个整数。在C的上下文中,这些操作的结果都是一个整数,这并不奇怪。这通常比浮点运算更精确。请考虑您对<代码> 7/3代码/代码>的注释。此值不能用有限的二进制数或有限的十进制数表示。换句话说,在今天的计算机上,除非我们使用整数,否则我们无法准确地表示
7/3
!这个分数最准确的表示是“商2,余数1”

那么,是否没有改变的好理由?我想不出任何理由,我可以想出一些不改变的好理由。其他答案都没有提到Visual Basic(至少在版本6中)有两个用于整数除法的运算符:
/
将整数转换为双精度,以及