El rincón de JMACOE

Javascript: Redondeo a 0 o a 0.5

En un proyecto reciente que tuve la necesidad de redondear un número al decimal más cercano de la mitad (por lo que el número se quedará en 0.0 o a 0.5) utilizando JavaScript. Por lo tanto, si el valor era 100.1 o 100.2, devolvería 100. Si el valor fue de 100.3 o 100.4, devolvería 100.5, y así sucesivamente. No hay funciones de redondeo integradas en JavaScript.

La función toma un número con un cero o decimales. Si hay cero decimales, el número ya es un número entero. Usando este supuesto, lo primero que hace la función es conseguir el valor decimal. Esto se hace en dos estados. El primero toma el número y resta la parte entera. Así que sólo tenemos la parte decimal. La parte decimal se multiplica por 10 y luego se ha redondeado para eliminar cualquier parte fraccionaria que pudieran subsistir. Por lo tanto, si el valor es 100,55, la parte decimal sería de 6. Esto fue sólo una garantía, ya que sabía los números que llegaban tenían un solo decimal.

Una vez tuve la parte decimal, verifico para ver si tenía 5. Si lo fuera, entonces el número que viene más probable es «x.5» («x» es la parte entera y la parte fraccionaria es «0.5»). Digo «probablemente» porque en mi función que estaba recibiendo un punto decimal. Pero si el número se viene en «x.49», la parte decimal se traduciría en 5 (4,9 se redondea a 5). En este caso, quiero que la función para devolver adecuadamente «x.5», así que tomo la parte entera del número, añado 0,5 a él, y devolverá ese valor.

A continuación, si la parte decimal es inferior a 3 (0, 1, o 2) o superior a 7 (8 o 9), entonces el número se redondea (para valores inferiores a 3, se redondea al número entero inmediatamente inferior, y para valores mayores de 7, se redondeará al número entero inmediatamente superior) y el número devuelto es redondeado.

El verificación final es cuando la parte decimal es entre 3 y 7 (3, 4, 5, 6 ó 7). Estos valores deben resultar en «x.5» (donde x es la parte entera). Por lo tanto, tomo la parte entera del número y añado 0,5 a él como el valor a devolver. Aquí está la función:

function roundToHalf(value) { 
   var converted = parseFloat(value); // Make sure we have a number 
   var decimal = (converted - parseInt(converted, 10)); 
   decimal = Math.round(decimal * 10); 
   if (decimal == 5) { return (parseInt(converted, 10)+0.5); } 
   if ( (decimal < 3) || (decimal > 7) ) { 
      return Math.round(converted); 
   } else {
      return (parseInt(converted, 10)+0.5); 
   } 
} 

Comparte y diviertete: