creo que sólo debe hacer lo que usted sugiere - utilizar la posición del punto decimal. Obvio inconveniente podría ser que usted tiene que pensar en la internacionalización usted mismo.
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);
Hay otra cosa que podría intentar - los Decimal
tipo almacena un valor precission interna. Por lo tanto, puede usar Deciml.TryParse()
e inspeccionar el valor devuelto. Quizás el algoritmo de análisis mantenga la precisión de la entrada.
Finalmente, le sugiero que no intente algo usando números de coma flotante. Solo al analizar la entrada se eliminará cualquier información sobre los ceros al final. Por lo tanto, debe agregar un dígito artificial distinto de cero para conservarlos o hacer trucos similares. Es posible que se encuentre con problemas de precisión. Finalmente, encontrar la precisión basada en un número de coma flotante no es simple también. Veo algunas matemáticas feas o un ciclo que se multiplica con diez en cada iteración hasta que ya no hay ninguna parte fraccionaria. Y el bucle viene con nuevas emisiones de Precisión ...
ACTUALIZACIÓN
Analizar en unas obras deciaml. Se Decimal.GetBits()
para más detalles.
var input = "123.4560";
var number = Decimal.Parse(input);
// Will be 4.
var precision = (Decimal.GetBits(number)[3] >> 16) & 0x000000FF;
Desde aquí usando Math.Pow(0.1, precision)
es sencillo.
¿Estás seguro de que 4500 sería un 1, y no un 100? – corsiKa
¿Cuál es el resultado esperado en el caso 0.0 y 0.1? – user1785960
Para mí es una pregunta confusa. No pides precisión decimal. Usted pregunta: cómo obtener el número de dígitos en una parte de la fracción. La definición de 'precisión decimal' está aquí para Mí: https://docs.oracle.com/cd/B28359_01/server.111/b28318/datatype.htm#i16209 – user1785960