小编典典

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

algorithm

C#中所有经验丰富的程序员(我认为这来自C)都用于对除法中的整数进行强制转换,以获取小数/双精度/浮点型结果,而不是整数(实际结果被截断)。

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


阅读 550

收藏
2020-07-28

共1个答案

小编典典

C#的历史可追溯到C,因此答案为“为什么C#会这样?” 是“为什么在C中这样子?”的组合 和“没有充分的理由进行更改吗?”

C的方法是在高级语言和低级操作之间建立相当紧密的对应关系。处理器通常实现整数除法,以返回 商和余数, 二者均与操作数相同。

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

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

因此,没有充分的理由进行更改吗?我什么也想不出来,我 想到一些 改变的充分理由。没有其他答案提到过Visual
Basic(至少在版本6中)具有两个用于对整数进行除法的运算符:/将整数转换为double,然后返回double,同时\执行普通的整数运算。

\在努力使用浮点除法实现二进制搜索算法后,我了解了运算符。这真的很痛苦,整数除法就像是呼吸新鲜空气。没有它,在程序的初稿中将涉及很多特殊处理,以涵盖边缘情况和一个错误。

从这些经验中,我得出的结论是,使用不同的运算符来划分整数会造成混淆。

另一种选择是仅执行一个整数运算,该整数运算始终返回双精度数,并要求程序员截断它。这意味着每次要进行整数除法时,都必须执行两次int->
double转换,即截断和double->
int转换。还有多少程序员会错误地舍入或舍入结果而不是舍弃结果呢?这是一个更复杂的系统,至少容易出现程序员错误,而且速度较慢。

最后,除二进制搜索外,还有许多采用整数算术的标准算法。一个示例是将对象的集合划分为相似大小的子集合。另一种方法是在1维数组中的索引与2维矩阵中的坐标之间进行转换。

据我所知,就语言可用性而言,没有任何替代“ int / int yields int”的方法能幸免于成本效益分析,因此没有理由改变从C继承的行为。

结论:

  • 在许多标准算法中,整数除法通常很有用。
  • 当需要整数浮点除法,可以明确地用一个简单的,短的,并明确援引投:(double)a / b而不是a / b
  • 其他选择会给程序员带来更多的复杂性,并给处理器带来更多的时钟周期。
2020-07-28