¿Cómo puedo eliminar la parte decimal del número de JavaScript?

218

Tengo los resultados de una división y deseo descartar la porción decimal del número resultante.

¿Cómo puedo hacer esto?

JacobTheDev
fuente

Respuestas:

384

Podrías usar ...

... dependiendo de cómo quisieras eliminar el decimal.

Math.trunc()aún no es compatible con todas las plataformas (es decir, IE), pero mientras tanto podría usar fácilmente un polyfill .

Otro método para truncar la porción fraccional con excelente soporte de plataforma es mediante el uso de un operador bit a bit (.eg |0). El efecto secundario de usar un operador bit a bit en un número es que tratará su operando como un entero de 32 bits con signo, eliminando así el componente fraccional. Tenga en cuenta que esto también alterará los números mayores de 32 bits.


También puede estar hablando de la inexactitud del redondeo decimal con aritmética de coma flotante.

Lectura requerida: lo que todo informático debe saber sobre la aritmética de punto flotante .

alex
fuente
29
Tenga en cuenta que Math.floor()va a aumentar el valor numérico cuando el número es negativo . Así Math.floor(-1.2) -> -2mientras Math.floor(1.2) -> 1. parseInt(-1.2) -> -1( como lo menciona @FloydPink ) descartará la parte decimal como se esperaba para los números positivos y negativos .
Paul T. Rawkeen
1
@ PaulT.Rawkeen También podría usar un operador bit a bit para soltar la parte decimal, pero tenga en cuenta que también se trunca a 32 bits.
alex
2
lo siguiente muestra que esta respuesta es inestable:> (2.305*100)|0 > 230 > (2.3*100)|0 > 229
Jake
44
@Jake El resultado de 2.3*100en javascript es 229.99999999999997, por lo que parece que el operador bit a bit está haciendo su trabajo correctamente en su ejemplo.
Chad von Nau
¿Existe una solución similar a la |0que usa enteros de 64 bits?
Clint
49

También puede usar operadores bit a bit para truncar el decimal.

p.ej

var x = 9 / 2;
console.log(x); // 4.5

x = ~~x;
console.log(x); // 4

x = -3.7
console.log(~~x) // -3
console.log(x | 0) // -3
console.log(x << 0) // -3

Las operaciones bit a bit son considerablemente más eficientes que las funciones matemáticas. El operador de doble bit a bit no parece también superan ligeramente las x | 0y x << 0bit a bit operaciones por una cantidad insignificante.

// 952 milliseconds
for (var i = 0; i < 1000000; i++) {
    (i * 0.5) | 0;
}

// 1150 milliseconds
for (var i = 0; i < 1000000; i++) {
    (i * 0.5) << 0;
}

// 1284 milliseconds
for (var i = 0; i < 1000000; i++) {
    Math.trunc(i * 0.5);
}

// 939 milliseconds
for (var i = 0; i < 1000000; i++) {
    ~~(i * 0.5);
}

También vale la pena señalar que el operador bit a bit no tiene prioridad sobre las operaciones aritméticas, por lo que es posible que necesite rodear los cálculos con paréntesis para obtener el resultado deseado:

x = -3.7

console.log(~~x * 2) // -6
console.log(x * 2 | 0) // -7
console.log(x * 2 << 0) // -7

console.log(~~(x * 2)) // -7
console.log(x * 2 | 0) // -7
console.log(x * 2 << 0) // -7

Se puede encontrar más información sobre el operador doble bit a bit en NO doble bit a bit (~~)

Braden Steffaniak
fuente
2
Podría ser marginalmente eficiente. Pero, sugeriría funciones 'Math', ya que es más legible.
ashipj
Lo más probable es que esto no funcione si el entero no se representa como enteros con signo de 32 bits ( stackoverflow.com/a/7488075/3655192 )
Hiroki
30

También podrías hacer

parseInt(a/b)
Hari Pachuveetil
fuente
17
Tenga en cuenta que parseIntno funcionará de manera confiable para números grandes, porque funciona convirtiendo primero su argumento en una cadena, y para números grandes el resultado utilizará la notación exponencial. Por ejemplo: var n = 22222222222222222222222; parseInt(n);volverá 2, porque n.toString()devuelve 2.2222222222222223e+22.
2
Tampoco se usa parseInt()para su propósito, que es tomar un número en una cadena y devolver a Number.
alex
22

También puede mostrar un cierto número de dígitos después del punto decimal (aquí 2 dígitos) usando el siguiente código:

var num = (15.46974).toFixed(2)
console.log(num) // 15.47
console.log(typeof num) // string

Mahdi ghafoorian
fuente
44
Tenga en cuenta que toFixed () devuelve una cadena, no un número. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Jeanmichel Cote
1
¿Cómo es esta una respuesta cuando OP pide eliminar la parte decimal
Isaac
3
Aunque devuelve una cadena, puede usar el método Number () para corregir eso ... Number ((15.46974) .toFixed (2))
iPzard el
13

Utiliza la Math.round()función.

Math.round(65.98) // will return 66 
Math.round(65.28) // will return 65
Navdeep Singh
fuente
17
Para completar, esto es JavaScript simple, no consulta.
Dave Newton
1
$.round = Math.round;)
alex
12

Uso Math.round().

(La respuesta de Alex es mejor; hice una suposición :)

Dave Newton
fuente
6

Con ES2015, Math.trunc () está disponible.

Math.trunc(2.3)                       // 2
Math.trunc(-2.3)                      // -2
Math.trunc(22222222222222222222222.3) // 2.2222222222222223e+22
Math.trunc("2.3")                     // 2
Math.trunc("two")                     // NaN
Math.trunc(NaN)                       // NaN

No es compatible con IE11 o inferior, pero funciona en Edge y en cualquier otro navegador moderno.

Chad von Nau
fuente
2
¿Conoce alguna variación que permita truncar a X decimales? ¿Sería ingenuo pensar que Math.trunc(value * Math.pow(10,x)) / Math.pow(10,x)funcionaría?
jamiebarrow
2
Hola Jamie, parece que eso funcionaría en la mayoría de los casos, pero es susceptible a las trampas de coma flotante. Por ejemplo, value = 2.3y x = 2volveremos 2.29. No tengo una mejor sugerencia.
Chad von Nau
Esto para mí suena como la respuesta correcta. Sin redondeo superior o inferior. No hay problemas con los números negativos. Solo descarta el decimal. Como la pregunta solicitada.
Tienda Enrique Moreno
2

Si no le importa el enrutamiento, simplemente convierta el número en una cadena, luego elimine todo después del período, incluido el período. Esto funciona si hay un decimal o no.

const sEpoch = ((+new Date()) / 1000).toString();
const formattedEpoch = sEpoch.split('.')[0];
Helzgate
fuente
1

toFixed se comportará como redondo.

Para un piso como comportamiento use%:

var num = 3.834234;
var floored_num = num - (num % 1); // floored_num will be 3
Shahar H
fuente
2
¿Por qué crees que esto es mejor que usar Math.floor? Su solución parece innecesariamente compleja y lenta. No sé cómo funciona Math.floor, pero espero que esté mucho más optimizado. Además, me pregunto si su solución podría sufrir errores de redondeo de coma flotante.
Hans Roerdinkholder
1

Aquí está la compresión en una explicación detallada con la ayuda de las publicaciones anteriores:

1. Math.trunc (): se utiliza para eliminar los dígitos seguidos de punto. Se convierte implícitamente. Pero, no es compatible con IE.

Ejemplo:

Math.trunc (10.5) // 10

Math.trunc (-10.5) // -10

Otra forma alternativa: Uso de bit a bit no operador:

Ejemplo:

x = 5.5

~~ x // 5

2. Math.floor (): se utiliza para dar el valor entero mínimo posible. Es compatible con todos los navegadores.

Ejemplo:

Math.floor (10.5) // 10

Math.floor (-10.5) // -11

3. Math.ceil (): se usa para dar el valor entero más alto posible. Es compatible con todos los navegadores.

Ejemplo:

Math.ceil (10.5) // 11

Math.ceil (-10.5) // -10

4. Math.round (): se redondea al entero más cercano. Es compatible con todos los navegadores.

Ejemplo:

Math.round (10.5) // 11

Math.round (-10.5) // -10

Math.round (10.49) // 10

Math.round (-10.51) // -11

sreepurna
fuente
0

Para una implementación de ES6, use algo como lo siguiente:

const millisToMinutesAndSeconds = (millis) => {
  const minutes = Math.floor(millis / 60000);
  const seconds = ((millis % 60000) / 1000).toFixed(0);
  return `${minutes}:${seconds < 10 ? '0' : ''}${seconds}`;
}
Jared
fuente
0

Esto es para aquellos que desean evitar que los usuarios ingresen números decimales

<input id="myInput" onkeyup="doSomething()" type="number" />

<script>
    function doSomething() {

        var intNum = $('#myInput').val();

        if (!Number.isInteger(intNum)) {
            intNum = Math.round(intNum);
        }

        console.log(intNum);
    }
</script>
Masoud Darvishian
fuente
0

Puede usar .toFixed (0) para eliminar la parte decimal completa o proporcionar el número en argumentos hasta el que desea truncar el decimal.

Nota: toFixed convertirá el número a cadena.

Nikhil Kamani
fuente
0

Por ejemplo:

var x = 9.656;
x.toFixed(0);           // returns 10
x.toFixed(2);           // returns 9.66
x.toFixed(4);           // returns 9.6560
x.toFixed(6);           // returns 9.656000 

o

parseInt("10");         // returns 10
parseInt("10.33");      // returns 10
parseInt("10 20 30");   // returns 10
parseInt("10 years");   // returns 10
parseInt("years 10");   // returns NaN  
kelly k audrey
fuente