valor - En.net, ¿cómo puedo elegir entre un decimal y un doble?
valor float c# (3)
Por lo general pienso en cantidades naturales o artificiales .
Las cantidades naturales son cosas como el peso, la altura y el tiempo. Estos nunca se medirán con absoluta precisión, y rara vez se tiene una idea de aritmética absolutamente exacta: generalmente no se deben agregar alturas y luego asegurarse de que el resultado sea exactamente el esperado. Utilice double
para este tipo de cantidad. Los dobles tienen un rango enorme, pero precisión limitada; También son extremadamente rápidos.
La cantidad artificial dominante es el dinero. Existe tal cosa como "exactamente $ 10.52", y si le agrega 48 centavos, espera tener exactamente $ 11. Usa el decimal
para este tipo de cantidad. Justificación: dado que, para empezar, es artificial, los números involucrados también son artificiales, diseñados para satisfacer las necesidades humanas, lo que significa que se expresan naturalmente en la base 10. Haga que la representación de almacenamiento coincida con la representación humana. decimal
no tiene el rango de double
, pero la mayoría de las cantidades artificiales tampoco necesitan ese rango adicional. También es más lento que el double
, pero personalmente tengo una cuenta bancaria que me dio la respuesta correcta lentamente que una respuesta incorrecta rápidamente :)
Para un poco más de información, tengo artículos sobre los tipos de punto flotante binario .NET y el tipo decimal .NET . (Tenga en cuenta que decimal
es un tipo de punto flotante, pero el "punto" en cuestión es un punto decimal, no un punto binario).
Estuvimos discutiendo esto el otro día en el trabajo y desearía que hubiera una pregunta de Stackoverflow a la que apuntaría a la gente, así que aquí va.
- ¿Cuál es la diferencia entre un
Double
y unDecimal
? - ¿Cuándo (en qué casos) debería usar siempre un
Double
? - ¿Cuándo (en qué casos) debería usar siempre un
Decimal
? - ¿Cuáles son los factores determinantes a tener en cuenta en los casos que no caen en uno de los dos campos mencionados arriba?
Hay muchas preguntas que se superponen a esta pregunta, pero tienden a preguntarse qué debe hacer alguien en un caso determinado, no cómo decidir en el caso general.
Si quieres mantener la precisión real, quédate con el decimal.
Si quieres comparar valor, quédate con decimal.
si usas doble y haces esto
? ctype(1.0, Double ) / 3
conseguirás
0.33333333333333331
si usas decimal y haces esto
? ctype(1.0, Decimal ) /3
conseguirás
0.333333333333333333333333333333D
Y un ejemplo más, uno extremo.
decimal dec = new decimal(1, 1, 1, false, 28);
var dou = (double)dec;
Produciría esto, doble perdería algo de precisión.
? dou
0.0000000018446744078004519
? dic
0.0000000018446744078004518913D
en el final,
doble = aproximación
decimal = cosa real
SQL Server También vale la pena mencionar que el decimal en SQL Server se correlaciona con Decimal y Nullable Decimal en el marco .net. Mientras flote en el servidor sql se asigna a Double y Nullable Double. Por si acaso terminas tratando con una aplicación de base de datos.
Oracle ya no trabajo con oracle, como puede ver, está tachado en la información de mi perfil :), sin embargo, para quienes trabajan con oracle, aquí hay un artículo de MSDN que mapea los tipos de datos de oracle:
http://msdn.microsoft.com/en-us/library/yk72thhd(VS.80).aspx