Я думаю, вы должны просто сделать то, что вы предложили - использовать положение десятичной точки. Очевидный недостаток может заключаться в том, что вы должны самостоятельно подумать об интернационализации.
var decimalSeparator = NumberFormatInfo.CurrentInfo.CurrencyDecimalSeparator;
var position = input.IndexOf(decimalSeparator);
var precision = (position == -1) ? 0 : input.Length - position - 1;
// This may be quite unprecise.
var result = Math.Pow(0.1, precision);
Есть еще одна вещь, которую вы можете попробовать - тип Decimal
хранит внутреннее значение точности. Поэтому вы можете использовать Decimal.TryParse()
и проверить возвращаемое значение. Возможно, алгоритм синтаксического анализа поддерживает точность ввода.
Наконец, я бы предложил не пытаться что-либо использовать числа с плавающей запятой. Просто анализ входных данных удалит любую информацию о конечных нулях. Таким образом, вы должны добавить искусственную ненулевую цифру, чтобы сохранить их или делать подобные трюки. Вы можете столкнуться с проблемами точности. Наконец, найти точность на основе числа с плавающей запятой тоже непросто. Я вижу некрасивую математику или цикл, умножающийся на десять на каждой итерации, пока не останется никакой дробной части. И цикл идет с новыми проблемами точности ...
UPDATE
Разбор в десятичную систему. Se Decimal.GetBits()
для деталей.
var input = "123.4560";
var number = Decimal.Parse(input);
// Will be 4.
var precision = (Decimal.GetBits(number)[3] >> 16) & 0x000000FF;
Отсюда использование Math.Pow(0.1, precision)
прямо вперед.