2009-10-12 21 views
19

Quiero convertir todos los números con una precisión de 0,25redondeo al más cercano 0.25 javascript

Entonces ...

5 becomes 5.00 
2.25 becomes 2.25 
4 becomes 4.00 
3.5 becomes 3.50 

Gracias

+14

ningún intento en su final? – random

+4

Esta pregunta no parece tener sentido. Todos sus números se están convirtiendo en sí mismos, no se está redondeando. – Barmar

Respuesta

71

Aquí es una implementación de lo rslite dijo:

var number = 5.12345; 
number = (Math.round(number * 4)/4).toFixed(2); 
+1

También trabajo en Java, gracias. – Fedearne

+3

@Fedearne: Esto es más bien un problema aritmético que un problema de lenguaje. – Gumbo

+1

Aquí está como una función: var roundNearQtr = function (number) { return (Math.round (number * 4)/4).ajustado (2); }; – spesic

56

Multiplicar por 4, redondo a un entero, se divide por 4 y formatee con dos decimales.

Editar ¿Alguna razón para los downvotes? Al menos deja un comentario para saber qué debería mejorarse.

+2

¿Por qué se ha bajado este valor? Es la respuesta correcta, después de todo. – Duroth

+0

¡Gracias! Me preguntaba lo mismo ... – rslite

+0

+1: Es lo correcto para mí también. – Steve

9

Si la velocidad es su preocupación, tenga en cuenta que usted puede conseguir una mejora de velocidad de 30% mediante el uso de:

var nearest = 4; 
var rounded = number + nearest/2 - (number+nearest/2) % nearest; 

de mi página web: http://phrogz.net/round-to-nearest-via-modulus-division
Las pruebas de rendimiento aquí: http://jsperf.com/round-to-nearest

+0

Gran respuesta ... Cambiar a esto si tienes números negativos var redondeado = número + más cercano/2 - Math.abs ((número + más cercano/2)% más cercano); – Lenny

+0

@Lenny Pero tenga en cuenta que cuando lo hace, está invocando una llamada a función ('Math.abs') y perderá el beneficio de velocidad. – Phrogz

0

una muy buena aproximación para el ro INANCIACIÓN:

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; 
} 
+0

¿Cómo es esto mejor que las otras respuestas? Los otros parecen mucho más cortos. (Podría analizar el código para tratar de descubrir qué ventaja tiene, pero es más rápido preguntar.^_ ^) – Venryx

1

Aquí es @ respuesta de Gumbo en forma de una función:

var roundNearQtr = function(number) { 
    return (Math.round(number * 4)/4).toFixed(2); 
}; 

Ahora puede hacer llamadas:

roundNearQtr(5.12345); // 5.00 
roundNearQtr(3.23); // 3.25 
roundNearQtr(3.13); // 3.25 
roundNearQtr(3.1247); // 3.00 
8

Aquí es una función genérica que hacer redondeo. En los ejemplos anteriores, se utilizó 4 porque está en el inverso de .25. Esta función le permite al usuario ignorar ese detalle. Actualmente no es compatible con la precisión preestablecida, pero se puede agregar fácilmente.

function roundToNearest(numToRound, numToRoundTo) { 
    numToRoundTo = 1/(numToRoundTo); 

    return Math.round(numToRound * numToRoundTo)/numToRoundTo; 
} 
+1

Esto requiere una operación adicional que 'Math.round (num/multiple) * multiple;'. * Sin embargo *, es mi versión preferida por una razón importante: no da resultados como "0.3000000000000004" para 'Round (.2 + .1, .1)'. – Venryx

0

uso por debajo de la función, creo que sirve

function roundByQuarter(value) { 
    var inv = 1.0/0.25; 
    return Math.round(value * inv)/inv; 
} 

Llame a la función como abajo, dará como resultado el valor barrio más cercano, es decir que no volverá 0.32, 0.89, 0.56, pero lo hará devuelve .25, .75, .50 decimales solamente.

roundByQuarter(2.74) = 2.75 

roundByQuarter(2.34) = 2.25 

roundByQuarter(2.94) = 3.00 

roundByQuarter(2.24) = 2.25 
0
function roundToInc(num, inc) { 
    const diff = num % inc; 
    return diff>inc/2?(num-diff+inc):num-diff; 
} 

> roundToInc(233223.2342343, 0.01) 
233223.23 
> roundToInc(505, 5) 
505 
> roundToInc(507, 5) 
505 
> roundToInc(508, 5) 
510 
Cuestiones relacionadas