Math.ceil10(55, 2) returns 100 where 2 expresses an exponent for 10^2. Besides of logarithmic adjustment we can use modulo based adjustment. It is almost the same as above but uses an arbitrary number for adjustment.
/**
* Modulo base adjustment of a number
*
* Math.floorModulo(value, modulo)
* Math.ceilModulo(value, modulo)
* Math.roundModulo(value, modulo)
*
* @param {number} value The number
* @param {number} modulo The modulo
* @return {number] The adjusted value
*/
(function()
{
var names = ['floor', 'ceil', 'round'];
for (var i = 0; i < names.length; i++) {
var name = names[i];
(function(name, method)
{
//Math[name] =
Math[name + 'Modulo'] =
function(value, modulo)
{
return arguments.length < 2
? method(value)
: method(value / modulo) * modulo;
};
})(name, Math[name]);
}
})();
// Floor
Math.floorModulo(5, 5); // 5
Math.floorModulo(6, 5); // 5
Math.floorModulo(7, 5); // 5
Math.floorModulo(8, 5); // 5
Math.floorModulo(9, 5); // 5
Math.floorModulo(10, 5); // 10
// Ceil
Math.ceilModulo(5, 5); // 5
Math.ceilModulo(6, 5); // 10
Math.ceilModulo(7, 5); // 10
Math.ceilModulo(8, 5); // 10
Math.ceilModulo(9, 5); // 10
Math.ceilModulo(10, 5); // 10
// Round
Math.roundModulo(5, 5); // 5
Math.roundModulo(6, 5); // 5
Math.roundModulo(7, 5); // 5
Math.roundModulo(8, 5); // 10
Math.roundModulo(9, 5); // 10
Math.roundModulo(10, 5); // 10
JavaScript – Rounding with Precision is another implementation of number adjustment by Chris West.
ReplyDelete