在我测试过的语言中,- (x div y )不等于-x div y;我用Python测试了//次,用Ruby测试了/次,用Perl 6测试了div次;C has a similar behavior

这种行为通常符合规范,因为div通常被定义为the rounding down of the result of the division,但是从算术的Angular 来看,它没有太多意义,因为它使div根据符号以不同的方式表现,并且它会导致像this post on how it is done in Python这样的混淆.

这个设计决策背后是否有一些具体的理由,或者仅仅是从头定义的?在一篇解释Python是如何实现的博客文章中,显然是Guido van Rossum uses a coherency argument,但如果你 Select 汇总,你也可以有一致性.

(灵感来源于this question by PMurias in the #perl6 IRC channel)

推荐答案

浮点运算由IEEE754定义,并考虑数值应用程序,默认情况下,以非常严格的定义方式四舍五入到最接近的可表示值.

计算机中的整数运算由通用国际标准定义.语言(尤其是C族语言)授予的操作往往遵循底层计算机提供的任何操作.有些语言比其他语言更严格地定义某些操作,但为了避免在当时可用(和流行)的计算机上实现过于困难或缓慢,它们会 Select 一个与其行为密切相关的定义.

由于这个原因,整数运算在溢出时趋向于wrap around(对于加法、乘法和左移),在产生不精确结果时趋向于round towards negative infinity(对于除法和右移).两位补二进制算法中的Both of these are simple truncation at their respective end of the integer;处理拐弯案件的最简单方法.

其他答案讨论了语言在除法的同时可能提供的余数或模运算符之间的关系.不幸的是,他们倒过来了.Remainder depends on the definition of division, not the other way around,虽然模数可以独立于除法来定义——如果两个参数恰好都是正的,除法取整,它们的计算结果是相同的,所以人们很少注意到.

大多数现代语言要么提供余数运算符,要么提供模运算符,很少同时提供这两种运算符.库函数可以为关心差异的人提供另一种操作,即余数保留被除数的符号,而模保留除数的符号.

Ruby相关问答推荐

获取用于传递参数的变量名称

Rb:仅通过在 Ruby 中的类上添加 each 方法,可枚举模块是如何工作的?

如何解密在 sjcl.js 中使用 ruby​​ 创建的 AES-256-GCM

判断一个数组是否是Ruby中另一个数组的子集

Ruby反斜杠在新行上继续字符串?

我可以在 Ruby 的 heredoc 中访问变量吗?

为什么安全导航比在 Rails 中使用 try 更好?

对具有相同键的 2 个哈希属性求和

在 Ruby 中将数组转换为索引哈希

在单个 node 上使用 XPath 返回所有 node 中的元素

Ruby 1.9 - 无效的多字节字符(US-ASCII)

如何在运行时判断 Ruby 中的 Gem 版本?

Ruby 中的 method_missing trap

文字数字中的下划线是什么意思?

如何理解 strptime 与 strftime

if语句末尾带有then有什么区别?

使用整数作为哈希键

判断整数是否在范围内

类变量上的 attr_accessor

如何在文件夹及其所有子文件夹中搜索特定类型的文件