validar saber positivo numeros numero negativos negativo convertir como java math modulo negative-number

saber - convertir numero negativo a positivo java



¿Cómo hace Java los cálculos de módulo con números negativos? (14)

¿Estoy haciendo mal el módulo? Porque en Java -13 % 64 se supone que evalúa a -13 pero obtengo 51 .


¿Estás seguro de que estás trabajando en Java? porque Java da -13% 64 = -13 como se esperaba. ¡El signo de dividendo!


Ambas definiciones de módulo de números negativos están en uso: algunos lenguajes usan una definición y otros la usan.

Si quiere obtener un número negativo para las entradas negativas, puede usar esto:

int r = x % n; if (r > 0 && x < 0) { r -= n; }

Del mismo modo, si estuvieras usando un idioma que arroja un número negativo en una entrada negativa, y prefieres positivo:

int r = x % n; if (r < 0) { r += n; }


Dado que "matemáticamente" ambos son correctos:

-13 % 64 = -13 (on modulus 64) -13 % 64 = 51 (on modulus 64)

Una de las opciones tuvo que ser elegida por los desarrolladores del lenguaje Java y eligieron:

el signo del resultado es igual al signo del dividendo.

Lo dice en las especificaciones de Java:

https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.17.3


De acuerdo con la sección 15.17.3 del JLS, "la operación restante para operandos que son enteros después de la promoción numérica binaria produce un valor de resultado tal que (a / b) * b + (a% b) es igual a A. Esta identidad se mantiene estable en el caso especial de que el dividendo es el entero negativo de mayor magnitud posible para su tipo y el divisor es -1 (el resto es 0) ".

Espero que ayude.


En las últimas versiones de Java, obtienes -13%64 = -13 . La respuesta siempre tendrá un signo de numerador.


En mi versión de Java JDK 1.8.0_05 -13% 64 = -13

podrías intentar -13- (int (-13/64)) en otras palabras hacer un cast de división a un entero para deshacerte de la parte fracción y luego restar del numerador Entonces el numerador- (int (numerador / denominador)) debería dar el correcto resto y signo


La aritmética del módulo con operandos negativos es definida por el diseñador del lenguaje, que podría dejarlo en la implementación del lenguaje, quien podría diferir la definición a la arquitectura de la CPU.

No pude encontrar una definición de lenguaje Java.
Gracias Ishtar, Especificación del lenguaje Java para el Operador remanente% dice que el signo del resultado es el mismo que el del numerador.


La función mod se define como la cantidad por la cual un número excede el múltiplo entero más grande del divisor que no es mayor que ese número. Entonces en tu caso de

-13 % 64

el múltiplo entero más grande de 64 que no excede -13 es -64. Ahora, cuando resta -13 de -64 es igual a 51 -13 - (-64) = -13 + 64 = 51


No creo que Java devuelva 51 en este caso. Estoy ejecutando Java 8 en una Mac y obtengo:

-13 % 64 = -13

Programa:

public class Test { public static void main(String[] args) { int i = -13; int j = 64; System.out.println(i % j); } }


Para superar esto, puede agregar 64 (o cualquiera que sea su base de módulo) al valor negativo hasta que sea positivo

int k = -13; int modbase = 64; while (k < 0) { k += modbase; } int result = k % modbase;

El resultado seguirá estando en la misma clase de equivalencia.


Su resultado es incorrecto para Java. Proporcione algún contexto sobre cómo llegó a él (su programa, implementación y versión de Java).

De la Especificación de Lenguaje Java

15.17.3% restante del operador
[...]
La operación restante para operandos que son enteros después de la promoción numérica binaria (§5.6.2) produce un valor de resultado tal que (a / b) * b + (a% b) es igual a a.
15.17.2 Operador de división /
[...]
La división entera redondea hacia 0.

Dado que / se redondea hacia cero (dando como resultado cero), el resultado de% debe ser negativo en este caso.


Tu respuesta está en wikipedia: operación de módulo

Dice que en Java la operación de módulo de inicio de sesión es la misma que la de dividendo. y dado que estamos hablando del resto de la división, la operación está bien, que devuelve -13 en su caso, ya que -13/64 = 0. -13-0 = -13.

EDIT: Perdón, malentendió tu pregunta ... Tienes razón, java debería dar -13. ¿Puedes proporcionar más código circundante?


puedes usar

(x % n) - (x < 0 ? n : 0);


x = x + m = x - m en el módulo m .
entonces -13 = -13 + 64 en el módulo 64 y -13 = 51 en el módulo 64 .
supongamos Z = X * d + r , si 0 < r < X entonces en la división Z/X llamamos r al resto.
Z % X devuelve el resto de Z/X