1 (изменено: Rumata, 2013-05-19 14:56:08)

Тема: JS: Округление по модулю (обсуждение)

На страницах MDN есть пример десятичного округления чисел по степеням 10. Недавно на глаза попался фрагмент кода java, где реализовано округление по произвольному числу. Реализовал на javascript. Публикую, вдруг кому-то понадобится.



(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

( 2 * b ) || ! ( 2 * b )

2

Re: JS: Округление по модулю (обсуждение)

Если не будет замечаний — публикуйте и в Коллекции (я не смотрел, не специалист по javascript).

3

Re: JS: Округление по модулю (обсуждение)

Без замечаний

4

Re: JS: Округление по модулю (обсуждение)

with ({
	names: ['round', 'floor', 'ceil'],
	i: Number(),
	name: String()
}) {
	for (i = 0; i < names.length; i++) {
		name = names[i];
		with ({method: Math[name]}) {
			Math[name] = function (value, modulo) {
				//if (modulo == void null) modulo = 1;
				if (modulo == void null) return method(value);
				return method(value / modulo) * modulo;
			}
		}
	}
}

Math.floor(5.1); // по-прежнему 5
Math.floor(5.1, 2); // 4
Math.floor(5.1, -1); // 6 -- modulo < 0 меняет местами пол и потолок