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

Die*_*ego 7 c# algorithm double int

C#中所有有经验的程序员(我认为这来自C)用于对分区中的整数进行强制转换,以获得decimal/double/float结果而不是int(实际结果被截断).

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

pho*_*oog 13

C#将其遗产追溯到C,所以回答"为什么它在C#中就像这样?" 是"C为什么会这样?"的组合.并且"没有充分的理由改变?"

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

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

解决方案是为除法和余数提供单独的操作,每个操作都返回一个整数.在C的上下文中,每个操作的结果都是整数并不奇怪.这通常比浮点算法更准确.考虑你的评论中的例子7 / 3.该值不能用有限二进制数表示,也不能用有限的十进制数表示.换句话说,在今天的计算机上,除非我们使用整数,否则我们无法准确表示!7 / 3 该分数的最准确表示是"商2,余数1".

那么,没有充分的理由改变吗?我想不出任何一个,我可以想到一些改变的好理由.其他答案都没有提到Visual Basic(至少通过版本6)有两个运算符来划分整数:/将整数转换为double,并返回double,同时\执行正常的整数运算.

\在努力使用浮点除法实现二进制搜索算法后,我了解了算子.真的很痛苦,整齐的分裂就像呼吸新鲜空气一样.没有它,在程序的初稿中有许多特殊处理来覆盖边缘情况和逐个错误.

根据这一经验,我得出的结论是,使用不同的运算符来划分整数是令人困惑的.

另一种选择是只有一个整数操作,它总是返回一个double,并要求程序员截断它.这意味着每次需要整数除法时,您必须执行两次int-> double转换,截断和double-> int转换.有多少程序员会错误地对结果进行舍入或舍入而不是截断它?这是一个更复杂的系统,至少容易出现程序员错误,而且速度较慢.

最后,除了二进制搜索之外,还有许多采用整数运算的标准算法.一个例子是将对象集合划分为相似大小的子集合.另一个是在1-d阵列中的索引和2-d矩阵中的坐标之间进行转换.

据我所知,"int/int yield int"的替代品在语言可用性方面无法进行成本效益分析,因此没有理由改变从C继承的行为.

结论:

  • 整数除法在许多标准算法中经常有用.
  • 当需要对整数进行浮点除法时,可以使用简单,简短和清晰的转换来显式调用它:(double)a / b而不是a / b
  • 其他替代方案为程序员和处理器的更多时钟周期带来了更多的复杂性.


Eri*_*ert 12

如果两个数字都是整数,是否有任何理由截断结果?

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

双打对于物理计算是很好的,小数位对于财务计算非常有用,但几乎所有用于完成任何数学计算机的工作都完全用整数表示.我不想因为我做了一些分裂而不断地将双精度或小数转换回整数.如果您正在解决物理或财务问题,那么为什么您首先使用整数?使用什么,但双打或小数.使用整数来解决有限的数学问题.

  • @Diego - 首先,正如Attila和其他人所指出的那样,有影响决定的历史和表现原因.但是,我认为你忽略了在现实世界中有很多次分数答案没有意义.埃里克举了一个例子,但还有很多其他的例子.如果我有一个23个孩子的教室,我想将它们分成10组进行某些活动,那么说每个组应该有2.3个孩子更"正确"吗? (3认同)

Att*_*ila 10

计算整数的速度(通常)比浮点值更快.此外,所有其他的整数/整数运算(+,-,*)返回一个整数.

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

OP的问题在于它们/在数学意义上被认为是分裂,并且/语言中的运算符执行一些其他操作(这不是数学分区).通过这样的逻辑,他们应该质疑所有其他操作(的有效性+,-,*)为好,因为那些有特殊溢出的规则,这是不一样的将从他们的数学同行可以预期的.如果这对某人来说很麻烦,他们应该找到另一种语言,其中操作按照人的预期执行.

关于有利于整数值的性能差异的主张:当我写答案时,我只有"民间"知识和"直觉"来支持这种说法(通过我的"通常"免责声明).事实上,正如加布指出的那样,有些平台并不成立.另一方面,我发现这个链接(第12点)显示了英特尔平台上的混合性能(尽管使用的语言是Java).

外卖应该是表现许多声称和直觉是未经证实的,直到测量和发现真实.