7

I am looking through a documentation on divmod. Part of a table showing the difference between methods div, divmod, modulo, and remainder is displayed below:

enter image description here

Why is 13.div(-4) rounded to -4 and not to -3? Is there any rule or convention in Ruby to round down negative numbers? If so, why is the following code not rounding down?

-3.25.round()  #3
4

1 回答 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)不是真正的四舍五入。它是整数除法,并遵循处理整数和模运算的自洽规则。您的链接中描述的舍入逻辑适合它,然后在一个或两个参数为s时处理相同的操作时一致地应用。负数或小数的数学运算通常以这种方式从对正整数的更简单、更直观的结果进行扩展。例如,这遵循与分数和负幂或非整数阶乘如何从它们的正整数变体创建类似的逻辑。divmodFloat

在这种情况下,这完全是关于 的自洽性divmod,而不是一般的四舍五入。

Ruby 的设计者在处理负数时可以做出选择,并不是所有的语言都会给出相同的结果。然而,一旦决定 Ruby 将返回与除数匹配的模结果符号(而不是作为一个整体匹配除数),这将设置其余数字的工作方式。

Ruby 中是否有任何规则或约定来舍入负数?

是的。对浮点数进行四舍五入意味着返回数字上最接近的整数。当有两个相等接近的整数时,Ruby 会舍入到离 0 最远的整数。这完全是与整数除法和模运算方法的工作方式不同的设计决策。

如果是这样,为什么下面的代码没有四舍五入?-3.25.round() #3

我假设您的意思是要读取的结果-3。舍入方法不会“向下舍入”。它确实“最接近”。-3是最接近的整数-3.25。Ruby 的设计者确实必须做出选择,如何处理-3.5.round() # -4. 某些语言会在舍入该数字时返回 -3。

于 2013-11-09T08:29:48.020 回答