¿Cómo se lanza un double
a decimal
que se usa cuando se hace el desarrollo de la moneda? ¿A dónde M
va?
decimal dtot = (decimal)(doubleTotal);
Solo usa M
para un literal numérico, cuando lanza es solo:
decimal dtot = (decimal)doubleTotal;
Tenga en cuenta que un número de punto flotante no es adecuado para mantener un valor exacto, por lo que si primero suma números y luego convierte a Decimal
, puede obtener errores de redondeo. Es posible que desee convertir los números Decimal
antes de sumarlos, o asegurarse de que los números no sean números de punto flotante en primer lugar.
Puede convertir un doble a un decimal como este, sin necesidad del
M
sufijo literal:double dbl = 1.2345D; decimal dec = (decimal) dbl;
Debe usar el
M
al declarar un nuevo valor decimal literal:decimal dec = 123.45M;
(Sin el
M
, 123.45 se trata como un doble y no se compilará).fuente
use la clase de conversión predeterminada:
Convert.ToDecimal(Double)
fuente
Convert.ToDecimal(the double you are trying to convert);
fuente
double
adecimal
, dado que para undouble
valor como (1000000.0 / 3.0) uno lo haría en algunos casos desea recortar el "exceso" de precisión dando 333333.333333333D, pero en otros casos uno querría retenerlo, dando 333333.333333333313931D. En lugar de simplemente decir "convertir a decimal", el código debe especificar cómo se debe realizar esa conversión.Convert.ToDecimal(double)
es el mismo que(decimal)doubleTotal
, excepto que si sedoubleTotal
cambia a un tipo diferente, probablemente evitaría un error en tiempo de compilación e introduciría un error en tiempo de ejecución más difícil de encontrar debido a un ToDecimal diferente se podría llamar a override. El operador de reparto es mucho más explícito ...Bueno, esta es una pregunta antigua y de hecho hice uso de algunas de las respuestas que se muestran aquí. Sin embargo, en mi escenario particular, era posible que el
double
valor al que quería convertir adecimal
menudo fuera mayor quedecimal.MaxValue
. Entonces, en lugar de manejar excepciones, escribí este método de extensión:public static decimal ToDecimal(this double @double) => @double > (double) decimal.MaxValue ? decimal.MaxValue : (decimal) @double;
El enfoque anterior funciona si no quiere molestarse en manejar las excepciones de desbordamiento y si tal cosa sucede, solo desea mantener el valor máximo posible (mi caso), pero soy consciente de que para muchos otros escenarios este no sería el comportamiento esperado y puede ser la excepción será necesaria la manipulación.
fuente