¿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);
Respuestas:
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á).
use la clase de conversión predeterminada: Convert.ToDecimal(Double)
Convert.ToDecimal(the double you are trying to convert);
double
a decimal
, dado que para un double
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 se doubleTotal
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 a decimal
menudo fuera mayor que decimal.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.