what residuo que programacion operator funcion java scala modulo

java - residuo - En Scala, ¿por qué el operador(%) restante devuelve un número negativo?



que es mod (5)

En scala, ¿por qué el operador (%) restante devuelve un número negativo?

Existen diferentes convenciones para el signo del resultado de una operación de módulo; Wikipedia tiene un buen artículo sobre él . Scala, como la mayoría, pero de ninguna manera todos los lenguajes de programación, tiene el resultado de tomar el signo del dividendo (el -3 en su caso).

¿Cuál es la forma preferida de obtener el resto positivo en Scala?

Dudo que haya una forma preferida generalmente acordada; si fuera yo, use Math.floorMod , que da un resultado con el signo del divisor ( 2 en su ejemplo) en lugar del dividendo (esto no significa simplemente el mismo valor que % con un signo diferente, vea la JavaDoc vinculado para más detalles). O simplemente un if afterward ( if (result < 0) { result += M; } [donde M es el divisor, 2 en tu ejemplo]).

Por ejemplo, (-3) % 2 devolverá -1 lugar de 1 .

¿Cuál es la forma preferida de obtener el resto positivo en Scala? ¿Tal como (((-3) % 2) + 2) % 2 , o abs(-3 % 2) ?


El uso de math.abs(-x % y) no suele producir el mismo comportamiento que devolver un módulo positivo:

scala> math.abs(-7 % 3) res46: Int = 1

Pero eso no es lo que dice Python (un lenguaje que devuelve un módulo positivo):

In [14]: -7 % 3 Out[14]: 2

Si observamos incrementos de 3 a partir de -7:

-7, -4, -1, 2, ..

scala detiene en -1 , y python detiene en 2 .


La forma correcta de obtener el módulo positivo es agregar el divisor al módulo negativo:

(-18 % 5) + 5

Tomar el valor absoluto te dará la solución incorrecta en este caso, aunque funcionará si el divisor resulta ser 2.

Si no conoce el signo del dividendo, puede hacer algo como esto:

((dividend % divisor) + divisor) % divisor


Me gustaría añadir algo a las respuestas existentes. Mi forma preferida de obtener el resto positivo es agregar un nuevo método al tipo Int de la siguiente manera:

object Extensions { implicit class ExtendedInt (val i: Int) extends AnyVal { def positiveMod (m: Int) = {val x = i % m; if (x < 0) x + m else x} } }

En el archivo donde desea usar el método, importe la clase implícita con:

import Extensions._

Ahora puedes hacer:

(-3).positiveMod(2)

También puede colocar la clase implícita en un objeto de paquete para que no tenga que importar al llamar a la función desde el mismo paquete.


Por ejemplo, si desea filtrar todos los elementos impares de una matriz, ignorando negativo o positivo, puede hacer lo siguiente:

arr.filter {x => Math.abs (x% 2) == 1}