C#中所有经验丰富的程序员(我认为这来自C)都用于对除法中的整数进行强制转换,以获取小数/双精度/浮点型结果,而不是整数(实际结果被截断)。
我想知道为什么这样实现吗?如果两个数字都是整数,是否有充分的理由截断结果?
C#的历史可追溯到C,因此答案为“为什么C#会这样?” 是“为什么在C中这样子?”的组合 和“没有充分的理由进行更改吗?”
C的方法是在高级语言和低级操作之间建立相当紧密的对应关系。处理器通常实现整数除法,以返回 商和余数, 二者均与操作数相同。
(所以我的问题是,“为什么类C语言中的整数除法不返回 两个整数 ”,而不是“为什么不返回浮点值?”)
解决方案是为除法和余数提供单独的运算,每个运算返回一个整数。在C的上下文中,每个操作的结果都是整数也就不足为奇了。这通常比浮点运算 更准确 。考虑您对的评论中的示例7 / 3。此值不能用有限的二进制数 或有限的十进制数表示 。换句话说,在当今的计算机上, _ 除非* _使用整数, _ 否则_ 我们 _无法准确表示 !7 / 3 *_该分数的最准确表示是“商2,余数1”。
7 / 3
因此,没有充分的理由进行更改吗?我什么也想不出来,我 能 想到一些 不 改变的充分理由。没有其他答案提到过Visual Basic(至少在版本6中)具有两个用于对整数进行除法的运算符:/将整数转换为double,然后返回double,同时\执行普通的整数运算。
/
\
\在努力使用浮点除法实现二进制搜索算法后,我了解了运算符。这真的很痛苦,整数除法就像是呼吸新鲜空气。没有它,在程序的初稿中将涉及很多特殊处理,以涵盖边缘情况和一个错误。
从这些经验中,我得出的结论是,使用不同的运算符来划分整数会造成混淆。
另一种选择是仅执行一个整数运算,该整数运算始终返回双精度数,并要求程序员截断它。这意味着每次要进行整数除法时,都必须执行两次int-> double转换,即截断和double-> int转换。还有多少程序员会错误地舍入或舍入结果而不是舍弃结果呢?这是一个更复杂的系统,至少容易出现程序员错误,而且速度较慢。
最后,除二进制搜索外,还有许多采用整数算术的标准算法。一个示例是将对象的集合划分为相似大小的子集合。另一种方法是在1维数组中的索引与2维矩阵中的坐标之间进行转换。
据我所知,就语言可用性而言,没有任何替代“ int / int yields int”的方法能幸免于成本效益分析,因此没有理由改变从C继承的行为。
结论:
(double)a / b
a / b