2012-05-02 25 views
6

Pregunta
¿Alguien sabe de una forma de redondear un flotador con una aproximación de 0.05 en JavaScript?Redondeando al 0.05 más cercano en JavaScript

Ejemplo

BEFORE | AFTER 
    2.51 | 2.55 
    2.50 | 2.50 
    2.56 | 2.60 

Código actual

var _ceil = Math.ceil; 
Math.ceil = function(number, decimals){ 
    if (arguments.length == 1) 
    return _ceil(number); 

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

Luego en otro lugar ... return (Math.ceil((amount - 0.05), 1) + 0.05).toFixed(2);

que está dando lugar ...

BEFORE | AFTER 
    2.51 | 2.55 
    2.50 | 2.55 
    2.56 | 2.65 

Respuesta

23

Multiplicar por 20, y se divide por 20:

(Math.ceil(number*20)/20).toFixed(2) 
+0

perfecto - muchas gracias. ¿Eres capaz de explicar * por qué * necesitas hacer esto? – Sam

+4

aunque consideraría este cambio 'Math.ceil (number * 20 - 0.5)/20) .toFixed (2)' – Arth

+0

1 = 20 * 0.05; se multiplica por 20, por lo que el redondeo al siguiente entero y luego dividir por 20 equivale al redondeo al siguiente 0,05 en el original. – Armatus

6

respuesta de Rob con mi además:

Math.ceil(number*20 - 0.5)/20).toFixed(2) 

De lo contrario, siempre se redondea hasta el 0,05 cercano.

** ACTUALIZACIÓN **

En este momento se ha señalado que esto no es lo que quería el cartel orig.

+0

Suba su comentario, pero luego me di cuenta de que el OP pidió que cerrara (vea el título de la pregunta). –

+4

+1 porque esto era exactamente lo que _I_ estaba buscando! – rymo

4

Me decantaría por el estándar de dividir realmente por el número que está factorizando, y redondeando eso y multiplicándolo de nuevo después. Ese parece ser un método de trabajo apropiado que puedes usar con cualquier número y mantener la imagen mental de lo que estás tratando de lograr.

var val = 26.14, 
    factor = 0.05; 

val = Math.round(val/factor) * factor; 

Esto funcionará para decenas, cientos o cualquier número. Si está redondeando específicamente al número más alto, utilice Math.ceil en lugar de Math.round.

2

me gustaría escribir una función que lo hace por usted por

  • mueve el decimal más de dos lugares (se multiplican por 100)
  • continuación mod (%) que inflatedNumber un 5 y obtener el resto
  • restar el remainder de 5 para que sepa lo que la 'brecha' (ceilGap) es de entre su número y el siguiente más cercano 0,05
  • por último, divida su inflatedNumber por 100 para que regrese a su flotador original, y listo, su número se redondeará al 0.05 más cercano.

    function calcNearestPointZeroFive(num){ 
        var inflatedNumber = num*100, 
         remainder  = inflatedNumber % 5; 
         ceilGap  = 5 - remainder 
    
        return (inflatedNumber + ceilGap)/100 
    } 
    

Si quieres dejar números como 5,50 intacta siempre se puede añadir este corrector:

if (remainder===0){ 
    return num 
} else { 
    var ceilGap = 5 - remainder 
    return (inflatedNumber + ceilGap)/100 
} 
0

Es necesario poner -1 a media vuelta hacia abajo y después de eso se multiplica por -1 como el ejemplo abajo abajo.

<script type="text/javascript"> 
 

 
    function roundNumber(number, precision, isDown) { 
 
    var factor = Math.pow(10, precision); 
 
    var tempNumber = number * factor; 
 
    var roundedTempNumber = 0; 
 
    if (isDown) { 
 
     tempNumber = -tempNumber; 
 
     roundedTempNumber = Math.round(tempNumber) * -1; 
 
    } else { 
 
     roundedTempNumber = Math.round(tempNumber); 
 
    } 
 
    return roundedTempNumber/factor; 
 
    } 
 
</script> 
 

 
<div class="col-sm-12"> 
 
    <p>Round number 1.25 down: <script>document.write(roundNumber(1.25, 1, true));</script> 
 
    </p> 
 
    <p>Round number 1.25 up: <script>document.write(roundNumber(1.25, 1, false));</script></p> 
 
</div>

Cuestiones relacionadas