public static decimal ToUnit(decimal number, decimal unit, MidpointRounding mode) { if (unit > 1m) unit = 1m; string unitStr = unit.ToString(); int decimals = 0; string separator = ThreadHelper.CurrentNumberFormat.NumberDecimalSeparator; int idx = unitStr.IndexOf(separator); if (idx >= 0) { bool nonZero = false; unitStr = unitStr.Substring(idx + separator.Length); foreach (char c in unitStr) { if (c == '0' && nonZero) break; if (c != '0') nonZero = true; decimals++; } } number = decimal.Round(number, decimals, mode); decimal i = decimal.ToInt32(number); decimal f = (decimal)Math.Pow(10d, decimals); decimal d = (number - i) * f; decimal u = unit * f; number = i + (d - d % u) / f; return number; }