Tengo números flotantes como 3.2
y 1.6
.
Necesito separar el número en la parte entera y decimal. Por ejemplo, un valor de 3.2
se dividiría en dos números, es decir 3
y0.2
Obtener la porción entera es fácil:
n = Math.floor(n);
Pero estoy teniendo problemas para obtener la porción decimal. He intentado esto:
remainer = n % 2; //obtem a parte decimal do rating
Pero no siempre funciona correctamente.
El código anterior tiene el siguiente resultado:
n = 3.1 => remainer = 1.1
¿Qué me estoy perdiendo aquí?
n = Math.floor(n);
solo devuelve el resultado deseado (la parte entera) para números no negativos% 1
not% 2
Respuestas:
Uso
1
, no2
.fuente
Math.*
u%
operaciones.toFixed
podría ayudar en algunas situaciones, por ejemplo,(2.3 % 1).toFixed(4)
=="0.3000"
.(2.3 % 1).toFixed(4).substring(2)
="3000"
si lo necesitas sin el0.
2.3
ha surgido, y no2
o3
, el número0.2999999999999998
es perfectamente aceptable a pesar de lo insultante que parece para los ojos humanos.Aunque esto no funcionará para números negativos, entonces podríamos tener que hacer
fuente
Math.floor()
, solo use la parte entera que ha calculado.var n = 3.2, integr = Math.floor(n), decimal = n - integr;
use Math.floor () solo una vez.integr = 3; decimal = 0.20000000000000018;
Math.floor
conMath.trunc
.Podrías convertir a cadena, ¿verdad?
fuente
n.toString()
lugar den + ""
porque es más legible.n + ""
es mejor (ver jsperf.com/number-vs-number-tostring-vs-string-number ).
como separador decimal, por lo que está bien en todas partes si el tipo de su variable de entrada es flotante. Solo tiene que lidiar con ese problema si su entrada es una cadena. También tengo que tener en cuenta que esta respuesta devuelve una cadena en una matriz. Una solución más completa esparseFloat('0.' + (n + '').split('.')[1])
¿Cómo es 0.2999999999999998 una respuesta aceptable? Si fuera el autor de la pregunta, me gustaría una respuesta de .3. Lo que tenemos aquí es precisión falsa, y mis experimentos con floor,%, etc. indican que a Javascript le gusta la precisión falsa para estas operaciones. Así que creo que las respuestas que están usando la conversión a cadena están en el camino correcto.
Yo haría esto:
Específicamente, estaba usando 100233.1 y quería la respuesta ".1".
fuente
.toString()
no considera i18n. El separador decimal siempre estará de.
acuerdo con MDN y la especificación ECMAAsí es como lo hago, que creo que es la forma más sencilla de hacerlo:
fuente
Una forma simple de hacerlo es:
Desafortunadamente, eso no devuelve el valor exacto. Sin embargo, eso se soluciona fácilmente:
Puede usar esto si no sabe el número de decimales:
fuente
Forma independiente del idioma:
tenga en cuenta que solo se corrige para números con una longitud fractioanal)
fuente
var factor = Math.pow(10, desiredFractionLength); var fract = a * factor % factor / factor;
Puede usar la
parseInt()
función para obtener la parte entera que usarla para extraer la parte decimalO podría usar expresiones regulares como:
fuente
0.20000000000000018
... esto realmente se está haciendo difícil porque0.2 < 0.20000000000000018
devuelve verdadero ... 3.2 se supone que devuelve 0.2: P haciendo tantas irregularidades y usando.toFixed(2)
retornos string: PLo siguiente funciona independientemente de la configuración regional para el separador decimal ... con la condición de que solo se use un carácter para un separador.
No es bonito, pero es exacto.
fuente
Si la precisión es importante y necesita resultados consistentes, aquí hay algunas propuestas que devolverán la parte decimal de cualquier número como una cadena, incluido el "0" inicial. Si lo necesita como flotador, simplemente agregue
var f = parseFloat( result )
al final.Si la parte decimal es igual a cero, se devolverá "0.0". Nulos, NaN y números indefinidos no se prueban.
1. String.split
2. String.substring, String.indexOf
3. Math.floor, Number.toFixed, String.indexOf
4. Math.floor, Number.toFixed, String.split
Aquí hay un enlace jsPerf: https://jsperf.com/decpart-of-number/
Podemos ver que la proposición # 2 es la más rápida.
fuente
Puede convertirlo en una cadena y usar el
replace
método para reemplazar la parte entera por cero, luego convertir el resultado a un número:fuente
/^[^,]/
), pero luego debe dejar el resultado como una cadena (eliminar el+
operador) para evitarNaN
resultados.Dependiendo del uso que le darás después, pero esta solución simple también podría ayudarte.
No digo que sea una buena solución, pero para algunos casos concretos funciona
Pero llevará más tiempo que la solución propuesta por @Brian M. Hunt
fuente
Tuve un caso en el que sabía que todos los números en cuestión solo tendrían un decimal y quería obtener la porción decimal como un entero, así que terminé usando este tipo de enfoque:
Esto funciona muy bien también con enteros, devolviendo 0 en esos casos.
fuente
Estoy usando:
Entrada: -556.123444444
Resultado: 123444444
fuente
Las funciones matemáticas son más rápidas, pero siempre devuelve valores no nativos esperados. La forma más fácil que encontré es
fuente
Una buena opción es transformar el número en una cadena y luego dividirlo.
En una línea de código
fuente
Después de mirar varios de estos, ahora estoy usando ...
fuente
fuente
Aunque llego muy tarde para responder esto, por favor eche un vistazo al código.
fuente
El formato de número y signo decimal de coma flotante puede depender del país (
.,
), por lo que la solución independiente, que conserva la parte de coma flotante, es:- es una solución internacionalizada, en lugar de dependiente de la ubicación:
Descripción de la solución paso a paso:
parseFloat()
para garantizar la corrección de entradaMath.abs()
para evitar problemas con números negativosn = parseInt(x)
para obtener la parte decimalx - n
para restar parte decimaltoFixed()
con el recuento de dígitos en la parte flotante del número flotante originalx
. El recuento se calcula como la diferencia entre la longitud del número originalx
y el númeron
en su representación de cadena.fuente
Usa este:
La
Math.frac
función aquí tiene 3 modos:Es sencillo :)
fuente
fuente