为什么在Ruby中划分后负数会向下舍入?

时间:2013-11-09 08:21:37

标签: ruby rounding divmod

我正在查看有关divmod的文档。显示方法divdivmodmoduloremainder之间差异的表格的一部分显示如下:

enter image description here

为什么13.div(-4)四舍五入到-4而不是-3? Ruby中是否有任何规则或惯例来舍入负数?如果是这样,为什么以下代码没有四舍五入?

-3.25.round()  #3

1 个答案:

答案 0 :(得分: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中描述的舍入逻辑符合它,然后在一个或两个参数为divmod时处理相同的Float操作时一致地应用。对于负数或分数的数学运算通常以这种方式从正整数的更简单,更直观的结果扩展。例如。这遵循类似的逻辑,如何从正整数变量创建分数和负幂,或非整数因子。

在这种情况下,所有关于divmod的自我一致性,而不是关于一般的舍入。

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

  

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

是。舍入浮点数意味着返回数字上最接近的整数。当有两个同样接近的整数时,Ruby会舍入到最远为0的整数。这是完全分开和模运算方法工作的完全独立的设计决策。

  

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

我认为你的意思是阅读-3的结果。圆形方法不会“向下舍入”。它确实“最接近”。 -3是与-3.25最接近的整数。 Ruby的设计师确实必须做出选择,但是如何处理-3.5.round() # -4。有些语言在舍入该数字时会返回-3。