Мне нужен метод округления для двойных значений в С#. Он должен иметь возможность округлить двойное значение до любого значения точности округления. Мой код под рукой выглядит так:
public static double RoundI(double number, double roundingInterval) {
if (roundingInterval == 0.0)
{
return;
}
double intv = Math.Abs(roundingInterval);
double sign = Math.Sign(number);
double val = Math.Abs(number);
double valIntvRatio = val / intv;
double k = Math.Floor(valIntvRatio);
double m = valIntvRatio - k;
bool mGreaterThanMidPoint = ((m - 0.5) >= 1e-14) ? true : false;
bool mInMidpoint = (Math.Abs(m - 0.5) < 1e-14) ? true : false;
return (mGreaterThanMidPoint || mInMidpoint) ? sign * ((k + 1) * intv) : sign * (k * intv);
}
Итак, RoundI (100, 3) должен дать 99, а RoundI (1.2345, 0.001) должен дать 1.235.
Проблема в том, что RoundI (1.275, 0.01) возвращает 1.27, а не 1.28. Это связано с тем, что при выполнении double valIntvRatio = val/intv, то есть double valIntvRatio = 1.275/0.01, он дает 0.12749999999999. Я знаю, что это проблема с двойным представлением на любом языке программирования. Мой вопрос в том, есть ли стандартный код, чтобы делать такие вещи, без необходимости беспокоиться о точности на двойном? Здесь я устанавливаю терпимость к 1е-14, но это слишком ограничивает эту проблему, и я не знаю, какой правильный допуск должен быть установлен. Спасибо за любую помощь.