2008-10-29 63 views
62

Mientras se trabaja en un proyecto, me encontré con un JS-script creado por un ex empleado que, básicamente, crea un informe en forma de¿Cómo redondeo un número en JavaScript?

Name : Value 
Name2 : Value2 

etc.

El peoblem es que los valores que a veces puede ser flotantes (con diferente precisión), enteros, o incluso en el formulario 2.20011E+17. Lo que quiero mostrar son enteros puros. Aunque no sé mucho de JavaScript. ¿Cómo voy a escribir un método que toma estas veces flota y las convierte en enteros?

+0

También recomendaría llamar a Math.floor() antes, por lo que no se redondea si eso es lo que estás buscando. – Archmede

Respuesta

46

Usted HAV a convertir su entrada en un número y luego en torno a ellos:

function toInteger(number){ 
    return Math.round( // round to nearest integer 
    Number(number) // type cast your input 
); 
}; 

o como un trazador de líneas:

function toInt(n){ return Math.round(Number(n)); }; 

de pruebas con diferentes valores:

toInteger(2.5);   // 3 
toInteger(1000);   // 1000 
toInteger("12345.12345"); // 12345 
toInteger("2.20011E+17"); // 220011000000000000 
+24

El único trazador de líneas es exactamente el mismo que el trazador de líneas 4 :) –

+8

El trazador de líneas real es 'Math.round (number)'. El negocio de fundición de tipo completo es innecesario. En JavaScript, las cadenas se fuerzan automáticamente a los números cuando es necesario. – AaronAsAChimp

+0

@AaronAsAChimp No puedo estar de acuerdo: si la cadena incluye otros caracteres que no sean dígitos y '.' o' E + ',' Math.round' devolverá 'NaN'. – matewka

15

Puede usar Math.round() para redondear números al número entero más cercano.

Math.round(532.24) => 532 

Además, se puede utilizar parseInt() y parseFloat() convertir una variable de un tipo determinado, en este caso de enteros y de coma flotante.

+0

Entonces Math.round (532.24,0) = 532? – Ace

+2

Math.round() no tiene un segundo argumento, ya que redondea el número al entero más cercano. –

29

Según el ECMAScript specification, los números en JavaScript están representados solo por el formato de 64 bits de doble precisión IEEE 754. Por lo tanto, no existe realmente un tipo entero en JavaScript.

En cuanto al redondeo de estos números, hay varias formas de lograrlo. El objeto Math nos da tres métodos de redondeo que podemos usar:

El es el más utilizado, devuelve el valor redondeado al número entero más cercano. Luego está el Math.floor() que devuelve el número entero más grande menor o igual que un número. Por último, tenemos la función Math.ceil() que devuelve el entero más pequeño mayor o igual que un número.

También está el toFixed() que devuelve una cadena que representa el número utilizando la notación de punto fijo.

Obs .: No hay ninguna segundo argumento en el método Math.round().El toFixed() es es decir, no específica, su within la especificación ECMAScript aswell

+0

Buena explicación y mi mal para suministrar el segundo argumento; Editaré mi respuesta para reflejar esto. –

+0

Solo tiene que ir por la especificación =] –

102

Si tiene que redondear a un cierto número de dígitos utilizar la siguiente función

function roundNumber(number, digits) { 
      var multiple = Math.pow(10, digits); 
      var rndedNum = Math.round(number * multiple)/multiple; 
      return rndedNum; 
     } 
+13

Podría ser mejor usar ['.toFixed()'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed), agregado en JavaScript 1.5. –

+1

Tenga en cuenta que toFixed() genera una cadena. '(0.1 + 0.2) .toFixed (2)' produce la cadena "0.30". Pero puede obtenerlo de nuevo en un número anteponiendo "+". '+ (0.1 + 0.2) .toFixed (2)' produce el número 0.3 – Chris

+2

si está usando lodash u can [función redonda de lodash] (https://lodash.com/docs/4.17.4#round): '_ .round (número, precisión) ' – qwertz

25

Aquí está una manera de poder utilizar Math.round() con un segundo argumento (número de decimales para redondeo):

// 'improve' Math.round() to support a second argument 
var _round = Math.round; 
Math.round = function(number, decimals /* optional, default 0 */) 
{ 
    if (arguments.length == 1) 
    return _round(number); 

    var multiplier = Math.pow(10, decimals); 
    return _round(number * multiplier)/multiplier; 
} 

// examples 
Math.round('123.4567', 2); // => 123.46 
Math.round('123.4567'); // => 123 
20

también puede utilizar toFixed(x) o toPrecision(x) donde x es el número de dígitos.

Ambos métodos son compatibles con todos los navegadores

0

una muy buena aproximación para el redondeo:

function Rounding (number, precision){ 

var newNumber; 
var sNumber = number.toString(); 

var increase = precision + sNumber.length - sNumber.indexOf('.') + 1; 

if (number < 0) 
    newNumber = (number - 5 * Math.pow(10,-increase)); 
else 
    newNumber = (number + 5 * Math.pow(10,-increase)); 

var multiple = Math.pow(10,precision); 

return Math.round(newNumber * multiple)/multiple; 
} 

Sólo en algunos casos, cuando la longitud de la parte decimal del número es muy tiempo pasará ser incorrecto

-1

Math.floor (19.5) = 19 también debería funcionar.

+1

Piso! = Redondo. 'piso (19.5) == 19', pero' redondo (19.5) = 20'. – Dukeling