¿Hay alguna manera de obtener las "cifras significativas" de un decimal?

Actualizar

De acuerdo, después de un poco de investigación, y gracias en gran parte a las útiles respuestas proporcionadas por Jon y Hans, esto es lo que pude reunir. Hasta ahora creo que parece funcionar bien. No apostaría mi vida a su total corrección, por supuesto.

public static int GetSignificantDigitCount(this decimal value)
{
    /* So, the decimal type is basically represented as a fraction of two
     * integers: a numerator that can be anything, and a denominator that is 
     * some power of 10.
     * 
     * For example, the following numbers are represented by
     * the corresponding fractions:
     * 
     * VALUE    NUMERATOR   DENOMINATOR
     * 1        1           1
     * 1.0      10          10
     * 1.012    1012        1000
     * 0.04     4           100
     * 12.01    1201        100
     * 
     * So basically, if the magnitude is greater than or equal to one,
     * the number of digits is the number of digits in the numerator.
     * If it's less than one, the number of digits is the number of digits
     * in the denominator.
     */

    int[] bits = decimal.GetBits(value);

    if (value >= 1M || value <= -1M)
    {
        int highPart = bits[2];
        int middlePart = bits[1];
        int lowPart = bits[0];

        decimal num = new decimal(lowPart, middlePart, highPart, false, 0);

        int exponent = (int)Math.Ceiling(Math.Log10((double)num));

        return exponent;
    }
    else
    {
        int scalePart = bits[3];

        // Accoring to MSDN, the exponent is represented by
        // bits 16-23 (the 2nd word):
        // http://msdn.microsoft.com/en-us/library/system.decimal.getbits.aspx
        int exponent = (scalePart & 0x00FF0000) >> 16;

        return exponent + 1;
    }
}

No lo he probado tan a fondo. Sin embargo, aquí hay algunas entradas / salidas de muestra:

Value          Precision
0              1 digit(s).
0.000          4 digit(s).
1.23           3 digit(s).
12.324         5 digit(s).
1.2300         5 digit(s).
-5             1 digit(s).
-5.01          3 digit(s).
-0.012         4 digit(s).
-0.100         4 digit(s).
0.0            2 digit(s).
10443.31       7 digit(s).
-130.340       6 digit(s).
-80.8000       6 digit(s).

Usando este código, imagino que lograría mi objetivo haciendo algo como esto:

public static decimal DivideUsingLesserPrecision(decimal x, decimal y)
{
    int xDigitCount = x.GetSignificantDigitCount();
    int yDigitCount = y.GetSignificantDigitCount();

    int lesserPrecision = System.Math.Min(xDigitCount, yDigitCount);

    return System.Math.Round(x / y, lesserPrecision);
}

Sin embargo, realmente no he terminado de trabajar en esto. Cualquiera que quiera compartir pensamientos: ¡eso sería muy apreciado!

Pregunta original

Supongamos que escribo este código:

decimal a = 1.23M;
decimal b = 1.23000M;

Console.WriteLine(a);
Console.WriteLine(b);

Lo anterior generará:

1.23
1.23000

Me parece que esto también funciona si usodecimal.Parse("1.23")&nbsp;paraa&nbsp;ydecimal.Parse("1.23000")&nbsp;parab&nbsp;(lo que significa que esta pregunta se aplica a los casos en que el programa recibe información del usuario).

Claramente undecimal&nbsp;el valor es de alguna manera "consciente" de lo que llamaré suprecisión. Sin embargo, no veo miembros en eldecimal&nbsp;tipo que proporciona cualquier forma de acceder a esto, aparte deToString&nbsp;sí mismo.

Supongamos que quisiera multiplicar dosdecimal&nbsp;valores y recortar el resultado a la precisión del argumento menos preciso. En otras palabras:

decimal a = 123.4M;
decimal b = 5.6789M;

decimal x = a / b;

Console.WriteLine(x);

Las salidas anteriores:

21.729560302171195125816619416

Lo que pregunto es: ¿cómo podría escribir un método que devuelva21.73&nbsp;en su lugar (desde123.4M&nbsp;tiene cuatro cifras significativas)?

Para ser claros: me doy cuenta de que podría llamarToString&nbsp;en ambos argumentos, cuente las cifras significativas en cada cadena y use este número para redondear el resultado del cálculo. Estoy buscandodiferente&nbsp;camino, si es posible.

(YOademás&nbsp;tenga en cuenta que en la mayoría de los escenarios en los que se trata de cifras significativas, es probable que no necesite usar eldecimal&nbsp;tipo. Pero estoy preguntando porque, como mencioné al principio, eldecimal&nbsp;tipoaparece&nbsp;para incluir información sobre precisión, mientras quedouble&nbsp;no, por lo que yo sé).