Чтобы округлить число до кратного некоторого множителя, вы можете:
/// Round [number] up to a multiple of [factor].
///
/// The [factor] must be greater than zero.
int roundUp(int number, int factor) {
if (factor < 1) throw RangeError.range(factor, 1, null, "factor");
number += factor - 1;
return number - (number % factor);
}
Соответствующий roundDown
, который вы можете определить roundUp
в терминах:
int roundDown(int number, int factor) {
if (factor < 1) throw RangeError.range(factor, 1, null, "factor");
return number - (number % factor);
}
int roundUp(int number, int factor) => roundDown(number + (factor - 1), factor);
Округление в сторону плюс / минус бесконечности. Если вместо этого вы хотите округлить в сторону / от нуля, вы можете использовать:
int roundTowardsZero(int number, int factor) {
if (factor < 1) throw RangeError.range(factor, 1, null, "factor");
return number - number.remainder(factor);
}
int roundAwayFromZero(int number, int factor) =>
roundTowardsZero(number + number.sign * (factor - 1), factor);
Поскольку этот подход использует только целые числа, он относительно безопасен от потери точности, но может переполняться в самом конце целого числа диапазон (или если вы используете очень и очень большие коэффициенты). Если вы хотите обезопасить себя от этого, нам нужно добавить проверку, не переполняется ли number + factor - 1
. В большинстве практических случаев это не имеет значения.