2010-07-20 14 views

Respuesta

8

Decimal Floating Point artículo en la Wikipedia con relación específica a este artículo sobre System.Decimal.

Un decimal se almacena en 128 bits, aunque solo 102 son estrictamente necesarios. Es conveniente considerar el decimal como tres enteros de 32 bits que representan la mantisa, y luego un entero que representa el signo y el exponente. El bit superior del último entero es el bit de signo (de la manera normal, con el bit configurado (1) para números negativos) y los bits 16-23 (los bits bajos de la palabra de 16 bits alta) contienen el exponente. Los otros bits deben ser claros (0). Esta representación es la dada por decimal.GetBits (decimal) que devuelve una matriz de 4 ints.

+0

El el artículo vinculado fue útil; este Sr. Skeet parece una fuente confiable para preguntas relacionadas con C#. Él tiene muchos artículos interesantes. –

+7

throw new SomeOneDoesntKnowJonSkeetException(); –

+1

@Jouke: no es necesario un bloque 'try/catch', nunca se lanzará. –

0

De "CLR a través de C#" 3rd Edition por J.Richter:

Un valor de punto flotante de 128 bits de alta precisión utilizado para cálculos financieros en los que errores de redondeo no puede ser tolerado De los 128 bits, 1 bit representa el signo del valor, de 96 bits representan el valor en sí, y 8 bits representan la potencia de 10 a dividir el valor de 96 bits por (puede ser desde 0 a 28). Los bits restantes no se usan.

1

Como se describe en la página Estructura decimal de MSDN en http://msdn.microsoft.com/en-us/library/system.decimal(VS.80).aspx:

La representación binaria de un valor decimal consiste en un signo de 1 bit, un número entero 96 bits, y una escala factor utilizado para dividir el entero de 96 bits y especificar qué parte de él es una fracción decimal. El factor de escala es implícitamente el número 10, elevado a un exponente que va de 0 a 28. Por lo tanto, la representación binaria de un valor decimal es de la forma, ((-296 a 296)/10 (0 a 28)), donde -296-1 es igual a MinValue, y 296-1 es igual a MaxValue.

El factor de escala también conserva ceros finales en un número decimal. Los ceros finales no afectan el valor de un número decimal en operaciones aritméticas o de comparación. Sin embargo, los ceros finales pueden ser revelados por el método ToString si se aplica una cadena de formato apropiada .

0

La palabra clave decimal indica un tipo de datos de 128 bits.

Source

La representación binaria de un valor decimal consiste en una señal de 1 bit, un número entero de 96 bits, y un factor de escala se utiliza para dividir el entero de 96 bits y especificar qué parte de ella es una fracción decimal. El factor de escala es implícitamente el número 10, elevado a un exponente que va de 0 a 28. Por lo tanto, la representación binaria de un valor decimal es de la forma, ((-296 a 296)/10 (0 a 28)), donde -296-1 es igual a MinValue, y 296-1 es igual a MaxValue.

Source

0

Desde el C# Language Specifications:

El tipo decimal es un tipo de datos de 128 bits adecuada para los cálculos financieros y monetarios.
El tipo decimal puede representar valores que van desde 1.0 × 10 -28 hasta aproximadamente 7.9 × 10 con 28-29 dígitos significativos.

El conjunto finito de valores de tipo decimal son de la forma (-1) s × c × 10 -e, donde el signo s es 0 o 1, la coeficiente c está dada por 0 ≤ c , y la escala e es tal que 0 ≤ e ≤ 28.
El tipo decimal no admite ceros, infinitos o NaN firmados. Un decimal se representa como un entero de 96 bits escalado por una potencia de diez. Para decimales con un valor absoluto menor a 1.0m, el valor es exacto al 28 decimal ,, pero no más.

Para decimales con un valor absoluto mayor o igual a 1.0m, el valor es exacto para 28 o 29 dígitos. Contrariamente a los tipos de datos float y double, los números fraccionarios decimales como 0.1 se pueden representar exactamente en la representación decimal. En las representaciones float y double, tales números son a menudo fracciones infinitas, haciendo que esas representaciones sean más propensas a errores de redondeo.

Si uno de los operandos de un operador binario es de tipo decimal, entonces el otro operando debe ser de tipo integral o del tipo decimal. Si hay un operando de tipo integral presente, se convierte a decimal antes de que se realice la operación.

El resultado de una operación en valores del tipo decimal es el resultado del cálculo de un resultado exacto (escala de preservación, como se define para cada operador) y luego se redondea para ajustarse a la representación. Los resultados se redondean al valor representable más cercano y, cuando un resultado es igualmente cercano a dos valores representables, al valor que tiene un número par en la posición de dígito menos significativo (esto se conoce como "redondeo bancario"). Un resultado de cero siempre tiene un signo de 0 y una escala de 0.

Si una operación aritmética decimal produce un valor menor o igual a 5 x 10 -29 en valor absoluto, el resultado de la operación se convierte en cero . Si una operación aritmética decimal produce un resultado que es demasiado grande para el formato decimal, se lanza un System.OverflowException.

El tipo decimal tiene una mayor precisión pero menor alcance que los tipos de coma flotante. Por lo tanto, las conversiones de los tipos de punto flotante a decimal pueden producir excepciones de desbordamiento, y las conversiones de decimal a los tipos de coma flotante pueden causar pérdida de precisión. Por estas razones, no existen conversiones implícitas entre los tipos de coma flotante y decimal, y sin moldes explícitos, no es posible mezclar operandos de coma flotante y decimal en la misma expresión.

Cuestiones relacionadas