Я бы объявил переменную precision
и использовал бы итерацию, умножив эту переменную на 10
с исходным значением, которого она не достигла, что precision
добавит 1
.
, затем использует precision
переменная будет Math.Round
второй параметр.
static decimal RoundFirstSignificantDigit(decimal input) {
int precision = 0;
var val = input;
while (Math.Abs(val) < 1)
{
val *= 10;
precision++;
}
return Math.Round(input, precision);
}
Я бы написал метод расширения для этой функции.
public static class FloatExtension
{
public static decimal RoundFirstSignificantDigit(this decimal input)
{
int precision = 0;
var val = input;
while (Math.Abs(val) < 1)
{
val *= 10;
precision++;
}
return Math.Round(input, precision);
}
}
, затем использовал бы как
decimal input = 0.00001;
input.RoundFirstSignificantDigit();
c # online
Результат
(-0.001m).RoundFirstSignificantDigit() -0.001
(-0.00367m).RoundFirstSignificantDigit() -0.004
(0.000000564m).RoundFirstSignificantDigit() 0.0000006
(0.00000432907543029m).RoundFirstSignificantDigit() 0.000004