为什么在Ruby中进行除法计算后负数向下取整?

7

我正在查看divmod的文档。下面显示了一个表格,展示了方法divdivmodmoduloremainder之间的区别:

enter image description here

为什么13.div(-4)会被舍入为-4而不是-3?Ruby中是否有规则或约定来将负数向下舍入?如果是这样,为什么以下代码没有向下舍入?
-3.25.round()  #3

从表格正上方: "商向负无穷取整" - Stefan
1个回答

6

13.div(-4) == -413.modulo(-4) == -3,因此

(-4 * -4) + -3 == 13

你会得到一致的关系

(b * (a/b)) + a.modulo(b) == a

为什么13.div(-4)会舍入到-4而不是-3?
这是一个误解。 13.div(-4)实际上根本没有舍入。 这是整数除法,并遵循处理整数和模算术的自洽规则。 your link中描述的舍入逻辑符合它,并且在处理一个或两个参数为Float时,始终应用相同的divmod操作。负数或分数的数学运算通常以这种方式从更简单、更直观的正整数结果扩展。例如,这与如何从其正整数变体创建分数和负幂或非整数阶乘的逻辑类似。
在这种情况下,这一切都关乎divmod的自洽性,而不是舍入的一般性。
Ruby的设计者在处理负数时有一个选择,不同的语言会给出不同的结果。然而,一旦决定Ruby将返回与除数匹配的模结果符号(而不是整个除法匹配),这就确定了其余数字的工作方式。
在Ruby中,舍入浮点数意味着返回最接近的整数。当存在两个距离相等的整数时,Ruby会将其舍入为距离0最远的整数。这完全是与整数除法和模算术方法的工作方式无关的设计决策。
是的,在Ruby中有规则或约定来舍入负数。round()方法不是“向下舍入”,而是“四舍五入”。-3是最接近-3.25的整数。不过,Ruby的设计人员确实需要做出选择,即如何处理-3.5.round() # -4。有些语言会在舍入该数字时返回-3。

+1. 在 Ruby 中,取模运算符返回与除数相同的符号可能是值得添加的。 - devnull
是的,我看到了divmod方法是如何工作的。我已经写下了模数方法(x.modulo(y)意味着x-y*(x/y).floor),并且也理解了它。但是为什么13.div(-4)不是-3,因为13/-4 = -3.25? - gotqn
根据文档,div方法“使用/执行除法,然后将结果转换为整数。”因此,我认为,当结果为负数时,它会被舍入到更小的数字。在我的情况下,-3.25可以舍入为-3或-4,-4更小,因此被选择。这可能是情况吗? - gotqn
@gotqn:整数算术和浮点舍入并不像你想象的那样直接相关。浮点(或有理数)舍入实际上有一个不同的选择,并且在编程语言中实现不同的自洽行为。并非所有语言都以相同的方式实现整数除法或舍入。我将尝试添加更多细节来回答。 - Neil Slater

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接