Número de redondeo de JavaScript al 0,5 más cercano

96


¿Alguien puede darme una idea de cómo puedo redondear un número al 0,5 más cercano?
Tengo que escalar elementos en una página web de acuerdo con la resolución de la pantalla y para eso solo puedo asignar el tamaño de fuente en puntos a 1, 1.5 o 2 y en adelante, etc.

Si redondeo, se redondea a 1 decimal o a ninguno. ¿Cómo puedo realizar este trabajo?

Johnydep
fuente

Respuestas:

187

Escribe tu propia función que multiplique por 2, redondea y luego divida por 2, p. Ej.

function roundHalf(num) {
    return Math.round(num*2)/2;
}
newtron
fuente
Solo usé esto para limpiar una función de reducción en valores monetarios que regresaba con como 9 puntos decimales ... (num * 100) / 100 funcionó perfectamente.
Dustin Kreidler
Si desea terminar con 13.0 o 13.5, combiné su respuesta con la siguiente: function roundHalf (num) {return (Math.round (num * 2) / 2) .toFixed (1); }
Dan D
redondear el num * 2 no funciona para todos los casos ... intente cualquier decimal como 15.27 => usando su fórmula dará => 15 donde de hecho debería haber devuelto 15.5. **** Creo que usar toFixed será mejor (num * 2) .toFixed () / 2
sfdx bomb
@sfdxbomb ¿Ha comprobado esto? En la consola de mi navegador roundHalf(15.27)devuelve 15.5
malarres
81

Aquí hay una solución más genérica que puede serle útil:

function round(value, step) {
    step || (step = 1.0);
    var inv = 1.0 / step;
    return Math.round(value * inv) / inv;
}

round(2.74, 0.1) = 2,7

round(2.74, 0.25) = 2,75

round(2.74, 0.5) = 2,5

round(2.74, 1.0) = 3,0

Michael Deal
fuente
1
¿Qué invsignifica? ¿Qué invrepresenta la variable?
Deilan
1
@Deilan, supongo inverse.
Alex K
2

Math.round(-0.5)devuelve 0 , pero debería ser -1 según las reglas matemáticas.

Más información: Math.round () y Number.prototype.toFixed ()

function round(number) {
    var value = (number * 2).toFixed() / 2;
    return value;
}
Julia Savinkova
fuente
1
@Yuri Para ampliar lo que estás diciendo, roundredondea al siguiente entero mayor que el valor dado, que en términos de números negativos sería hacia el espectro de enteros positivos. -2,5 iría a -2. ¿Es eso correcto?
Danny Bullis
Sí, recién verificado. Math.ceil(-1.75) == -1y Math.floor(-1.75) == -2. Entonces, para cualquiera que se tropiece con esto, solo piense que ceildevuelve un número mayor que , floordevuelve un número menor que .
Danny Bullis
2

Para extender la respuesta principal por newtron para redondear a más de solo 0.5

function roundByNum(num, rounder) {
    var multiplier = 1/(rounder||0.5);
    return Math.round(num*multiplier)/multiplier;
}

console.log(roundByNum(74.67)); //expected output 74.5
console.log(roundByNum(74.67, 0.25)); //expected output 74.75
console.log(roundByNum(74.67, 4)); //expected output 76
Ronan Stoffers
fuente
1
    function roundToTheHalfDollar(inputValue){
      var percentile = Math.round((Math.round(inputValue*Math.pow(10,2))/Math.pow(10,2)-parseFloat(Math.trunc(inputValue)))*100)
      var outputValue = (0.5 * (percentile >= 25 ? 1 : 0)) + (0.5 * (percentile >= 75 ? 1 : 0))
      return Math.trunc(inputValue) + outputValue
    }

Escribí esto antes de ver la mejor respuesta de Tunaki;)

mekdigital
fuente
0
var f = 2.6;
var v = Math.floor(f) + ( Math.round( (f - Math.floor(f)) ) ? 0.5 : 0.0 );
Llamas
fuente
3
si f = 1.9, esto resultará en v = 1, lo cual es incorrecto.
bogatyrjov