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();
/// <remarks>https://stackoverflow.com/a/18146056/3194005</remarks>
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
);
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uTGlucTsKCnB1YmxpYyBjbGFzcyBUZXN0CnsKCXB1YmxpYyBzdGF0aWMgdm9pZCBNYWluKCkKCXsKCQlDb25zb2xlLldyaXRlTGluZShSb3VuZFRvU2lnbmlmaWNhbnRGaWd1cmVzKDIwLjA1MU0sIDQpKTsKCQlDb25zb2xlLldyaXRlTGluZShSb3VuZFRvU2lnbmlmaWNhbnRGaWd1cmVzKDIwLjAwMU0sIDQpKTsKCX0KCQpwcml2YXRlIHN0YXRpYyByZWFkb25seSBkZWNpbWFsW10gUG93cyA9IEVudW1lcmFibGUuUmFuZ2UoLTI4LCA1NykuU2VsZWN0KHAgPT4gKGRlY2ltYWwpTWF0aC5Qb3coMTAsIHApKS5Ub0FycmF5KCk7CgovLy8gPHJlbWFya3M+aHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE4MTQ2MDU2LzMxOTQwMDU8L3JlbWFya3M+CnB1YmxpYyBzdGF0aWMgZGVjaW1hbCBSb3VuZFRvU2lnbmlmaWNhbnRGaWd1cmVzKGRlY2ltYWwgdmFsdWUsIGludCBzaWduaWZpY2FudEZpZ3VyZXMpCnsKICAgIGlmICh2YWx1ZSA9PSAwKQogICAgICAgIHJldHVybiAwOwoKICAgIGludCBkID0gTG9nMTBDZWlsaW5nKE1hdGguQWJzKHZhbHVlKSk7CiAgICBpbnQgcG93ZXIgPSBzaWduaWZpY2FudEZpZ3VyZXMgLSBkOwoKICAgIGRlY2ltYWwgbWFnbml0dWRlID0gKGRlY2ltYWwpTWF0aC5Qb3coMTAsIHBvd2VyKTsKCiAgICB2YXIgcmVzID0gTWF0aC5Sb3VuZCh2YWx1ZSAqIG1hZ25pdHVkZSkgLyBtYWduaXR1ZGU7CiAgICB2YXIgaW52TWFnID0gMS9tYWduaXR1ZGU7CiAgICByZXR1cm4gcmVzICsgaW52TWFnIC0gaW52TWFnOwp9Cgpwcml2YXRlIHN0YXRpYyBpbnQgTG9nMTBDZWlsaW5nKGRlY2ltYWwgdmFsdWUpCnsKICAgIGludCBsb2cxMCA9IEFycmF5LkJpbmFyeVNlYXJjaChQb3dzLCB2YWx1ZSk7CgogICAgcmV0dXJuIChsb2cxMCA+PSAwID8gbG9nMTAgOiB+bG9nMTApIC0gMjg7Cn0JCgkKCQp9