The function takes in a number with zero or one decimals. If there are zero decimals, the number is already a whole number. Using this assumption, the first thing the function does is get that decimal value. That is done in two statements. The first takes the number and subtracts the integer part. So we have only the decimal part. That decimal part is multiplied by 10 and then rounded to remove any fractional part that might remain. So, if the value coming in was 100.55, the decimal part would be 6. This was just an assurance, since I knew the numbers coming in had only one decimal place.

Once I had that decimal part, I checked to see if it was 5. If it was, then the number coming in was most likely "x.5" ("x" is the whole number part and the fractional part was ".5"). I say "most likely" because in my function I was receiving one decimal point. But if the number coming in was "x.49", the decimal part would result in 5 (4.9 gets rounded to 5). In this case, I want the function to properly return "x.5", so I take the integer part of the number, add 0.5 to it, and return that value.

Next, if the decimal part is less than 3 (0, 1, or 2) or greater than 7 (8 or 9), then the number is rounded (for values less than 3 it is rounded down to the next lower integer, and for values greater than 7 it is rounded up to the next higher integer) and the rounded number is returned.

The final check is when the decimal part is between 3 and 7 (3, 4, 5, 6, or 7). These values need to result in "x.5" (where x is the whole number part). So I take the integer part of the number and add 0.5 to it as the value to return. Here's the function:

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);

}

}