Pregunta ¿Cómo convierto un número flotante a un número entero en JavaScript?


Me gustaría convertir un flotador a un número entero en JavaScript. En realidad, me gustaría saber AMBAS conversiones estándar: truncando y redondeando. Y de manera eficiente, no a través de la conversión a una cadena y el análisis.


861
2018-02-27 20:15


origen


Respuestas:


var intvalue = Math.floor( floatvalue );
var intvalue = Math.ceil( floatvalue ); 
var intvalue = Math.round( floatvalue );

// `Math.trunc` was added in ECMAScript 6
var intvalue = Math.trunc( floatvalue );

Referencia de objetos matemáticos


Ejemplos

Positivo
value = 5.5

Math.floor(value) //  5
Math.ceil(value)  //  6
Math.round(value) //  6
Math.trunc(value) //  5
parseInt(value)   //  5
~~value           //  5
value | 0         //  5
value >> 0        //  5
value >>> 0       //  5
value - value % 1 //  5
Negativo
value = -5.5

Math.floor(value) // -6
Math.ceil(value)  // -5
Math.round(value) // -5
Math.trunc(value) // -5
parseInt(value)   // -5
value | 0         // -5
~~value           // -5
value >> 0        // -5
value >>> 0       // 4294967291
value - value % 1 // -5
Positivo - Números más grandes
value = Number.MAX_SAFE_INTEGER/10 // 900719925474099.1

Math.floor(value) //  900719925474099
Math.ceil(value)  //  900719925474100
Math.round(value) //  900719925474099
Math.trunc(value) //  900719925474099
parseInt(value)   //  900719925474099
value | 0         //  858993459
~~value           //  858993459
value >> 0        //  858993459
value >>> 0       //  858993459
value - value % 1 //  900719925474099
Negativo - Números más grandes
value = Number.MAX_SAFE_INTEGER/10 * -1 // -900719925474099.1

Math.floor(value) // -900719925474100
Math.ceil(value)  // -900719925474099
Math.round(value) // -900719925474099
Math.trunc(value) // -900719925474099
parseInt(value)   // -900719925474099
value | 0         // -858993459
~~value           // -858993459
value >> 0        // -858993459
value >>> 0       //  3435973837
value - value % 1 // -900719925474099

1183
2018-02-27 20:21



Operador O bit a bit

Se puede usar un operador bit a bit para truncar figuras de punto flotante y funciona tanto para positivos como negativos:

function float2int (value) {
    return value | 0;
}

Resultados

float2int(3.1) == 3
float2int(-3.1) == -3
float2int(3.9) == 3
float2int(-3.9) == -3

¿Comparación de rendimiento?

He creado un Prueba JSPerf eso compara el rendimiento entre:

  • Math.floor(val)
  • val | 0  a nivel de bit O
  • ~~val  a nivel de bit NO
  • parseInt(val)

eso solo funciona con números positivos. En este caso, puede usar operaciones a nivel de bit así como Math.floor función.

Pero si necesitas tu código para trabajar con positivos y negativos, entonces una operación en modo bit es la más rápida (O siendo la preferida). Esta otra prueba JSPerf compara el mismo donde es bastante obvio que debido a la comprobación adicional de la señal Las matemáticas ahora son las más lentas de los cuatro.

Nota

Como se indica en los comentarios, los operadores BITWISE operan en enteros de 32 bits con signo, por lo tanto, se convertirán números grandes, por ejemplo:

1234567890  | 0 => 1234567890
12345678901 | 0 => -539222987

263
2017-10-11 10:18



Nota: no puedes usar Math.floor() como un reemplazo para truncado, porque Math.floor(-3.1) = -4 y no -3 !!

Un reemplazo correcto para truncado sería:

function truncate(value)
{
    if (value < 0) {
        return Math.ceil(value);
    }

    return Math.floor(value);
}

88
2017-10-14 16:17



Un doble no a nivel de bit el operador puede usarse para truncar flotadores. Las otras operaciones que mencionaste están disponibles a través de Math.floor, Math.ceily Math.round.

> ~~2.5
2
> ~~(-1.4)
-1

Más detalles cortesía de James Padolsey.


40
2018-01-11 16:54



Para truncar:

var intvalue = Math.floor(value);

Por ronda:

var intvalue = Math.round(value);

36
2018-02-27 20:22



Puedes usar el parseInt método para no redondear. Tenga cuidado con la entrada del usuario debido a las opciones de prefijo 0x (hex) y 0 (octal).

var intValue = parseInt(floatValue, 10);

22
2017-09-26 20:41



Cambio de bit por 0 que es equivalente a división por 1

// >> or >>>
2.0 >> 0; // 2
2.0 >>> 0; // 2

17
2017-07-25 07:33



En su caso, cuando desea una cadena al final (para insertar comas), también puede usar la función Number.toFixed (), sin embargo, esto realizará el redondeo.


7
2017-10-14 16:30