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 / bEri*_*ert 12
如果两个数字都是整数,是否有任何理由截断结果?
当然; 我可以很容易地想到十几个这样的场景.例如:您有一个大图像,并且图像的缩略图版本在两个维度上都小10倍.当用户单击大图像中的某个点时,您希望识别缩小图像中的相应像素.显然,要将x和y坐标除以10.为什么要获得十进制结果?相应的坐标将成为缩略图位图中的整数坐标.
双打对于物理计算是很好的,小数位对于财务计算非常有用,但几乎所有用于完成任何数学计算机的工作都完全用整数表示.我不想因为我做了一些分裂而不断地将双精度或小数转换回整数.如果您正在解决物理或财务问题,那么为什么您首先使用整数?使用什么,但双打或小数.使用整数来解决有限的数学问题.
Att*_*ila 10
计算整数的速度(通常)比浮点值更快.此外,所有其他的整数/整数运算(+,-,*)返回一个整数.
编辑:根据OP的要求,这里有一些补充:
OP的问题在于它们/在数学意义上被认为是分裂,并且/语言中的运算符执行一些其他操作(这不是数学分区).通过这样的逻辑,他们应该质疑所有其他操作(的有效性+,-,*)为好,因为那些有特殊溢出的规则,这是不一样的将从他们的数学同行可以预期的.如果这对某人来说很麻烦,他们应该找到另一种语言,其中操作按照人的预期执行.
关于有利于整数值的性能差异的主张:当我写答案时,我只有"民间"知识和"直觉"来支持这种说法(通过我的"通常"免责声明).事实上,正如加布指出的那样,有些平台并不成立.另一方面,我发现这个链接(第12点)显示了英特尔平台上的混合性能(尽管使用的语言是Java).
外卖应该是表现许多声称和直觉是未经证实的,直到测量和发现真实.