2011-01-12 25 views
19

tengo un número de punto flotante:¿Cómo obtener una fracción de un número flotante?

var f = 0.1457; 

O:

var f = 4.7005 

¿Cómo consigo sólo el resto fracción como número entero?

I.e. en el primer ejemplo quiero llegar:

var remainder = 1457; 

En el segundo ejemplo:

var remainder = 7005; 
+0

Tu pregunta no está bien definida. Para un número fp, el número de dígitos después de los puntos decimales depende de cómo lo visualice (la representación real no está en base-10, por lo que debe redondearse para mostrarse en base-10). – sleske

+2

¿Cómo pretendes mostrar 'var f = 0.0145;'? '145' o' 0145'? –

+1

Fuera de interés, ¿qué le gustaría mostrar en el caso de 0.123456 y 0.1? – Chris

Respuesta

6

Esto lo hará (hasta los 4 dígitos que se desee, cambiar el multipler (10000) a mayor o más pequeño si quieres más pequeño o más grande número):

Math.ceil(((f < 1.0) ? f : (f % Math.floor(f))) * 10000) 
+0

¿Qué le devolverá esto a 0.0000? –

+0

@Richard Knop: Debería dar 0. f será menor que 1.0, así que solo tomará f y se multiplicará por 10000, lo que por supuesto será 0. Por lo que veo, hace lo mismo que la respuesta de codenoob, pero es más difícil leer. :) – Chris

+0

Hehehe. Sí, la respuesta de codenoob es mucho más simple de leer :) –

3

puede restar el suelo de la serie, que le da sólo la parte fraccionaria, y luego se multiplica por 10.000, es decir:

var remainder = (f-Math.floor(f))*10000; 
+0

Buena respuesta simple, excepto que ha dado precisión a tres DP en lugar de cuatro. – Chris

+0

@Chris, error ortográfico corregido, ¡gracias! – lms

+1

no funcionará para números negativos, aunque – Gio

1

Esto también depende de lo que quieras hacer con el resto (como comentaron los comentadores). Por ejemplo, si el número base es 1.03, ¿desea que el resto devuelto sea 3 o 03? Quiero decir, ¿lo quiere como número o como cadena (para mostrarlo al usuario)? Un ejemplo sería la visualización del precio del artículo, donde no desea conversar 03 a 3 (por ejemplo $ 1.03) donde desea superíndice 03.

A continuación, el problema es con la precisión del flotador. Considere esto:

var price = 1.03; 
var frac = (price - Math.floor(price))*100; 
// frac = 3.0000000000000027 

para que pueda "resolver" esta por corte de la representación de cadena sin multiplicación (y opcional-relleno con ceros) en tales casos. Al mismo tiempo, evitas el problema de precisión flotante. También se demostró en this jsfiddle.

This post acerca de la precisión flotante podría ayudar tan bien como this one.

+0

Esto es una gran respuesta, porque realmente quería obtener la parte fraccionaria (es decir, 0.xxx) –

73
function frac(f) { 
    return f % 1; 
} 

esperanza que ayuda ;-)

+3

¡Esta es claramente la mejor respuesta! –

+0

esto es realmente genial, pero ¿cómo funciona? Puede usted explicar por favor ? – avi

+1

@avi, '%' es la [operación de módulo] (http://en.wikipedia.org/wiki/Modulo_operation), y el resto de cualquier número dividido por uno es el componente fraccionario de ese número. – dukedave

0
var strNumber = f.toString(); 
var remainder = strNumber.substr(strNumber.indexOf('.') + 1, 4); 
remainder = Number(reminder); 
2

parseInt(parseFloat(amount).toString().split('.')[1], 10)

+0

Devuelve 'NaN' para enteros, en lugar de 0. –

5

Si bien esto no es lo que la mayoría de la gente quiere, pero TS pidió fract como entero, aquí está:

function fract(n){ return Number(String(n).split('.')[1] || 0); } 
fract(1.23) // = 23 
fract(123) // = 0 
fract(0.0008) // = 8 
1

Argumentaría que, suponiendo que queremos mostrar estos valores al usuario, tratar estos números como cadenas sería th e mejor enfoque. Esto evita el problema de los valores fraccionarios como 0.002.

Me encontré con este problema al tratar de mostrar los precios con los centavos en superíndice.

let price = 23.43; // 23.43 
let strPrice = price.toFixed(2) + ''; // "23.43" 
let integer = strPrice.split(".")[0] // "23" 
let fractional = strPrice.split(".")[1] // "43" 
Cuestiones relacionadas