Sin, en general, fundición de doble a decimal no se siempre segura:
[TestCase(double.MinValue)]
[TestCase(double.MaxValue)]
[TestCase(double.NaN)]
[TestCase(double.NegativeInfinity)]
[TestCase(double.PositiveInfinity)]
public void WillFail(double input)
{
decimal result = (decimal)input; // Throws OverflowException!
}
Como OP aclaró en un comentario a la pregunta, "seguro" siendo "no causa excepciones de tiempo de ejecución", lo anterior muestra que las excepciones pueden se producen al convertir un doble a un decimal.
Lo anterior es la respuesta genérica a la que muchos Googlers podrían haber venido aquí. Sin embargo, para responder también al específica pregunta por OP, aquí hay un fuerte indicio de que el código no va a lanzar excepciones, incluso en casos extremos:
[Test]
public void SpecificCodeFromOP_WillNotFail_NotEvenOnEdgeCases()
{
int downtimeMinutes = 90;
foreach (TimeSpan duration in new[] {
TimeSpan.FromHours(2d), // From OP
TimeSpan.MinValue,
TimeSpan.Zero,
TimeSpan.MaxValue })
{
decimal calculatedDowntimePercent = duration.TotalMinutes > 0 ?
(downtimeMinutes/(decimal)duration.TotalMinutes) * 100.0m : 0.0m;
}
}
"seguro" en qué sentido - qué riesgos te preocupa? Imprecisión numérica? ¿Excepciones de tiempo de ejecución? ¿Algo más? –
Las excepciones de tiempo de ejecución fueron mi única preocupación. Me preguntaba si el doble siempre arroja con éxito al decimal. – Lisa