Me gustaría convertir un flotante a un número entero en JavaScript. En realidad, me gustaría saber cómo hacer AMBAS conversiones estándar: truncando y redondeando. Y de manera eficiente, no mediante la conversión a una cadena y el análisis.
javascript
syntax
mcherm
fuente
fuente
Respuestas:
Referencia de objeto matemático
Ejemplos
Positivo Negativo Positivo: números más grandes Negativo: números más grandesfuente
var intValue = ~~floatValue;
. Si la notación es demasiado oscuro para sus gustos, simplemente esconderlo en una función:function toInt(value) { return ~~value; }
. (Esto también convierte las cadenas en enteros, si lo desea).Math.trunc(val);
Comente porque esta es la respuesta aceptada2.3 - 2.3 % 1
Operador OR a nivel de bit
Se puede usar un operador u bit a bit para truncar figuras de punto flotante y funciona tanto para positivos como para negativos:
Resultados
¿Comparación de rendimiento?
He creado una prueba JSPerf que compara el rendimiento entre:
Math.floor(val)
val | 0
bitwise O~~val
NO bit a bitparseInt(val)
eso solo funciona con números positivos. En este caso, es seguro usar operaciones bit a bit como
Math.floor
función.Pero si necesita que su código funcione con positivos y negativos , entonces una operación bit a bit es la más rápida (O es la preferida). Esta otra prueba JSPerf compara lo mismo donde es bastante obvio que debido a la comprobación adicional de signos, Math es ahora el más lento de los cuatro.
Nota
Como se indicó en los comentarios, los operadores BITWISE operan con enteros de 32 bits con signo, por lo tanto, se convertirán grandes números, por ejemplo:
fuente
Math.floor()
es más rápido (al menos según mi ejecución de su primera prueba JSPerf en Google Chrome, versión 30.0.1599.101), más robusto (porque no depende de cómo se representan los números en bits, que puede cambiar y posiblemente romper esta solución bit a bit), y lo más importante, más explícito.~~
es mejor porque es un operador unario.4.2|0+4
igual4
pero~~4.2+4
igual8
Nota: ¡No se puede usar
Math.floor()
como un reemplazo para truncar, porqueMath.floor(-3.1) = -4
y no-3
!Un reemplazo correcto para truncar sería:
fuente
Math.trunc(value)
fue agregado en ECMAScript 6floor
redondea hacia -infinito,truncate
redondea hacia cero. (ceil
redondea hacia + infinito).Se puede usar un operador doble no bit a bit para truncar los flotadores. Las otras operaciones que usted ha mencionado están disponibles a través
Math.floor
,Math.ceil
yMath.round
.Más detalles cortesía de James Padolsey.
fuente
<canvas>
motor de representación de fuentes en JS . ¡Gracias!Para truncar:
Por ronda:
fuente
Puede usar el método parseInt para no redondear. Tenga cuidado con la entrada del usuario debido a las opciones de prefijo 0x (hexadecimal) y 0 (octal).
fuente
parseInt(1000000000000000000000, 10);
da como resultado 1, no 1 000 000 000 000 000 000 000. De todos modos, la pregunta explícitamente no quería " convertir a una cadena y analizar ", aunque eso es relativamente menor ...;)parseInt()
espera que una cadena no sea un número como primer parámetro. Cuando pasa este número entero, se convierte1e21
y luegoparseInt
analiza la cadena1e21
, lo que da como resultado1
.Desplazamiento de bits por 0, que es equivalente a la división por 1
fuente
>> 0
parece funcionar solo para enteros < 2 ^ 31-1 , y>>> 0
para enteros < 2 ^ 32-1 . Esto devuelve 0 para valores mayoresEn su caso, cuando desee una cadena al final (para insertar comas), también puede usar la
Number.toFixed()
función, sin embargo, esto realizará el redondeo.fuente
Hay muchas sugerencias aquí. El OR bit a bit parece ser el más simple con diferencia. Aquí hay otra solución corta que también funciona con números negativos utilizando el operador de módulo. Probablemente sea más fácil de entender que el bit a bit O:
Este método también funciona con números de alto valor donde ni '| 0' ni '~~' ni '>> 0' funcionan correctamente:
fuente
Para truncar :
Para redondear :
fuente
Una forma más posible: utilice la operación XOR:
La prioridad de las operaciones bit a bit es menor que la prioridad de las operaciones matemáticas, es útil. Pruebe en https://jsfiddle.net/au51uj3r/
fuente
Si busca un
Math
objeto nativo en JavaScript, obtiene todas las funciones para trabajar en números y valores, etc.Básicamente, lo que quieres hacer es bastante simple y nativo en JavaScript ...
Imagina que tienes el siguiente número:
y ahora si quieres redondearlo al número más cercano, simplemente haz lo siguiente:
y obtienes:
Si desea redondearlo al número más cercano, simplemente haga lo siguiente:
y obtienes:
Además,
Math.round
simplemente redondearlo a un número mayor o menor depende de cuál esté más cerca del número de flotador.También puede usar
~~
detrás del número flotante, que convertirá un flotante en un número entero.Puedes usarlo como
~~myValue
...fuente
~~
porque si el número es mayor que el límite int 32, cambiará el valor al valor límite int 32.fuente
Solo quiero señalar que monetariamente quieres redondear, y no truncar. Estar fuera por un centavo es mucho menos probable, ya que 4.999452 * 100 redondeado le dará 5, una respuesta más representativa.
Y además de eso, no se olvide del redondeo bancario , que es una forma de contrarrestar el sesgo ligeramente positivo que produce el redondeo directo: su aplicación financiera puede requerirlo.
Redondeo gaussiano / bancario en JavaScript
fuente
Si está utilizando angularjs, entonces la solución simple de la siguiente manera en Enlace de plantilla HTML
{{val | number:0}}
convertirá val en entero
ve a través de este enlace docs.angularjs.org/api/ng/filter/number
fuente