我正在查看有关divmod的文档。显示方法div
,divmod
,modulo
和remainder
之间差异的表格的一部分显示如下:
为什么13.div(-4)
四舍五入到-4
而不是-3
? Ruby中是否有任何规则或惯例来舍入负数?如果是这样,为什么以下代码没有四舍五入?
-3.25.round() #3
答案 0 :(得分:6)
13.div(-4) == -4
和13.modulo(-4) == -3
以便
(-4 * -4) + -3 == 13
你得到了一致的关系
(b * (a/b)) + a.modulo(b) == a
为什么13.div(-4)四舍五入为-4而不是-3?
这是一种误解。 13.div(-4)
并非完全舍入 。它是整数除法,遵循用于处理整数和模运算的自洽规则。 your link中描述的舍入逻辑符合它,然后在一个或两个参数为divmod
时处理相同的Float
操作时一致地应用。对于负数或分数的数学运算通常以这种方式从正整数的更简单,更直观的结果扩展。例如。这遵循类似的逻辑,如何从正整数变量创建分数和负幂,或非整数因子。
在这种情况下,所有关于divmod
的自我一致性,而不是关于一般的舍入。
Ruby的设计师在处理负数时可以选择,而不是所有语言都会给出相同的结果。但是,一旦确定Ruby将返回与除数匹配的模数结果的符号(而不是将除法作为整体匹配),则设置其余数字的工作方式。
Ruby中是否有任何规则或惯例来舍入负数?
是。舍入浮点数意味着返回数字上最接近的整数。当有两个同样接近的整数时,Ruby会舍入到最远为0的整数。这是完全分开和模运算方法工作的完全独立的设计决策。
如果是这样,为什么以下代码没有四舍五入?
-3.25.round() #3
我认为你的意思是阅读-3
的结果。圆形方法不会“向下舍入”。它确实“最接近”。 -3
是与-3.25
最接近的整数。 Ruby的设计师确实必须做出选择,但是如何处理-3.5.round() # -4
。有些语言在舍入该数字时会返回-3。