Pregunta División entera con resto en JavaScript?


En JavaScript, ¿cómo obtengo:

  1. la cantidad total de veces que un entero dado va a otro?
  2. ¿el resto?

691
2017-11-19 18:53


origen


Respuestas:


Para algún número y y algún divisor x calcular el cociente (quotient) y resto (remainder) como:

var quotient = Math.floor(y/x);
var remainder = y % x;

921
2017-11-19 18:55



No soy un experto en operadores bit a bit, pero aquí hay otra forma de obtener el número completo:

var num = ~~(a / b);

Esto funcionará correctamente para números negativos también, mientras Math.floor() girará en la dirección incorrecta.

Esto parece correcto también:

var num = (a / b) >> 0;

310
2017-11-19 19:14



Hice algunas pruebas de velocidad en Firefox.

-100/3             // -33.33..., 0.3663 millisec
Math.floor(-100/3) // -34,       0.5016 millisec
~~(-100/3)         // -33,       0.3619 millisec
(-100/3>>0)        // -33,       0.3632 millisec
(-100/3|0)         // -33,       0.3856 millisec
(-100-(-100%3))/3  // -33,       0.3591 millisec

/* a=-100, b=3 */
a/b                // -33.33..., 0.4863 millisec
Math.floor(a/b)    // -34,       0.6019 millisec
~~(a/b)            // -33,       0.5148 millisec
(a/b>>0)           // -33,       0.5048 millisec
(a/b|0)            // -33,       0.5078 millisec
(a-(a%b))/b        // -33,       0.6649 millisec

Lo anterior se basa en 10 millones de ensayos para cada uno.

Conclusión: Utilizar (a/b>>0) (o (~~(a/b)) o (a/b|0)) para lograr alrededor del 20% de ganancia en eficiencia. También tenga en cuenta que todos son inconsistentes con Math.floor, cuando a/b<0 && a%b!=0.


149
2018-06-20 15:42



ES6 presenta el nuevo Math.trunc método. Esto permite arreglar @ Respuesta de MarkElliot para hacer que funcione también para números negativos:

var div = Math.trunc(y/x);
var rem = y % x;

Tenga en cuenta que Math Los métodos tienen la ventaja sobre los operadores bit a bit que trabajan con números mayores de 231.


92
2018-03-10 17:30



var remainder = x % y;
return (x - remainder) / y;

21
2018-02-14 06:48



Puedes usar la función parseInt para obtener un resultado truncado

parseInt(a/b)

Para obtener un resto, use el operador mod:

a%b

ParseInt tiene algunas trampas con cadenas, para evitar el uso del parámetro radix con la base 10

parseInt("09", 10)

En algunos casos, la representación de cadena del número puede ser una notación científica, en este caso, parseInt producirá un resultado incorrecto.

parseInt(100000000000000000000000000000000, 10) // 1e+32

Esta llamada producirá 1 como resultado.


11
2018-04-13 17:17



JavaScript calcula a la derecha el piso de los números negativos y el resto de los números no enteros, siguiendo las definiciones matemáticas para ellos.

FLOOR se define como "el mayor número entero más pequeño que el parámetro", por lo tanto:

  • números positivos: PISO (X) = parte entera de X;
  • números negativos: PISO (X) = parte entera de X menos 1 (porque debe ser MÁS PEQUEÑO que el parámetro, es decir, ¡más negativo!)

REMAINDER se define como el "sobrante" de una división (aritmética euclidiana). Cuando el dividendo no es un número entero, el cociente generalmente tampoco es un número entero, es decir, no hay ningún resto, pero si el cociente se fuerza a ser un número entero (y eso es lo que sucede cuando alguien intenta obtener el resto o el módulo de un número de punto flotante), habrá un "remanente" no entero, obviamente.

JavaScript calcula todo como se espera, por lo que el programador debe tener cuidado de hacer las preguntas correctas (¡y la gente debe tener cuidado de responder lo que se le pide!) La primera pregunta de Yarin NO fue "¿cuál es la división entera de X por Y?", Pero en su lugar, "la cantidad total de veces que un entero determinado SE ENCUENTRA EN OTRO". Para números positivos, la respuesta es la misma para ambos, pero no para números negativos, porque la división entera (dividendo por divisor) será -1 más pequeña que las veces que un número (divisor) "entra" en otro (dividendo). En otras palabras, FLOOR devolverá la respuesta correcta para una división entera de un número negativo, ¡pero Yarin no preguntó eso!

gammax respondió correctamente, ese código funciona como lo pidió Yarin. Por otro lado, Samuel está equivocado, no hizo las matemáticas, supongo, o habría visto que sí funciona (además, no dijo cuál era el divisor de su ejemplo, pero espero que fuera 3):

Resto = X% Y = -100% 3 = -1

GoesInto = (X - Resto) / Y = (-100 - -1) / 3 = -99 / 3 = -33

Por cierto, probé el código en Firefox 27.0.1, funcionó como se esperaba, con números positivos y negativos y también con valores no enteros, tanto para dividendo como para divisor. Ejemplo:

-100.34 / 3.57: GoesInto = -28, Resto = -0.3800000000000079

Sí, lo noté, hay un problema de precisión allí, pero no tuve tiempo de verificarlo (no sé si es un problema con Firefox, Windows 7 o con la FPU de mi CPU). Sin embargo, para la pregunta de Yarin, que solo involucra números enteros, el código de gammax funciona perfectamente.


5
2018-02-27 19:23