Zaokrąglanie podwójnych wartości w C #
Chcę metodę zaokrąglania na podwójne wartości w C #. Musi być w stanie zaokrąglić podwójną wartość do dowolnej wartości precyzji zaokrąglania. Mój kod na wyciągnięcie ręki wygląda tak:
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);
}
Zatem RoundI (100, 3) powinien dać 99, a RoundI (1,2345, 0,001) powinien dać 1,235.
Problem polega na tym, że RoundI (1,275, 0,01) zwraca 1,27, a nie 1,28. Dzieje się tak, ponieważ podczas wykonywania podwójnego valIntvRatio = val / intv, czyli podwójnego valIntvRatio = 1,275 / 0,01, daje to 0.12749999999999. Wiem, że jest to problem z podwójną reprezentacją w dowolnym języku programowania. Moje pytanie brzmi: czy istnieje standardowy kod do wykonywania takich czynności, bez potrzeby martwienia się o precyzję na podwójnym? Tutaj ustawiam tolerancję na 1e-14, ale to jest zbyt restrykcyjne dla tego problemu i nie wiem, jaka jest właściwa tolerancja do ustawienia. Dziękuję za pomoc.