using System; using System.Linq; public class Test { public static void Main() { Console.WriteLine(RoundToSignificantFigures(20.051M, 4)); Console.WriteLine(RoundToSignificantFigures(20.001M, 4)); } private static readonly decimal[] Pows = Enumerable.Range(-28, 57).Select(p => (decimal)Math.Pow(10, p)).ToArray(); /// https://stackoverflow.com/a/18146056/3194005 public static decimal RoundToSignificantFigures(decimal value, int significantFigures) { if (value == 0) return 0; int d = Log10Ceiling(Math.Abs(value)); int power = significantFigures - d; decimal magnitude = (decimal)Math.Pow(10, power); var res = Math.Round(value * magnitude) / magnitude; var invMag = 1/magnitude; return res + invMag - invMag; } private static int Log10Ceiling(decimal value) { int log10 = Array.BinarySearch(Pows, value); return (log10 >= 0 ? log10 : ~log10) - 28; } }