using System.Globalization;
public static void Main()
Console.WriteLine(SignificantFiguresFormatter.FormatWithSignificantFigures(val,3));
Console.WriteLine(SignificantFiguresFormatter.FormatWithSignificantFigures(val,4));
Console.WriteLine(SignificantFiguresFormatter.FormatWithSignificantFigures(val,5));
Console.WriteLine(SignificantFiguresFormatter.FormatWithSignificantFigures(val,6));
Console.WriteLine(SignificantFiguresFormatter.FormatWithSignificantFigures(val,7));
public static class SignificantFiguresFormatter
public static string FormatWithSignificantFigures(double value, int significantFigures)
if (double.IsNaN(value) || double.IsInfinity(value) || value == 0.0)
return value.ToString("G", CultureInfo.InvariantCulture);
int digitsBeforeDecimal = (int)Math.Floor(Math.Log10(Math.Abs(value))) + 1;
int totalDigits = significantFigures;
int decimalPlaces = totalDigits - digitsBeforeDecimal;
if (Math.Abs(digitsBeforeDecimal) > 5)
return value.ToString("E" + (significantFigures - 1), CultureInfo.InvariantCulture);
string formatString = "F" + Math.Max(decimalPlaces, 0);
double rounded = Math.Round(value, Math.Max(decimalPlaces, 0), MidpointRounding.AwayFromZero);
string result = rounded.ToString(formatString, CultureInfo.InvariantCulture);
if (!result.Contains(".") && decimalPlaces > 0)
result += "." + new string('0', decimalPlaces);