Я хочу метод округления на двойные значения в C #. Он должен иметь возможность округлять двойное значение до любого значения точности округления. Мой код на руках выглядит так:
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. Я знаю, что это проблема с двойным представлением на любом языке программирования. У меня вопрос, есть ли стандартный код для таких вещей, без необходимости беспокоиться о точности в два раза? Здесь я установил допуск на 1e-14, но это слишком ограниченно для этой проблемы, и я не знаю, какой правильный допуск нужно установить. Спасибо за любую помощь.