No, in generale, colata da doppia a decimale non è sempre sicuro:
[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!
}
Come OP chiarito in un commento alla domanda, "sicura" essere "non causa eccezioni fase di esecuzione", gli spettacoli di cui sopra che le eccezioni possono verificarsi quando lancia un doppio a un decimale.
Quanto sopra è la risposta generica molti Googler potrebbero Sono venuto qui per questo. Tuttavia, per rispondere anche alla specifica domanda da OP, ecco una forte indicazione che il codice non generare eccezioni, anche in casi limite:
[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;
}
}
"Safe" in che senso - quali rischi ti preoccupi? Imprecisione numerica? Eccezioni di runtime? Qualcos'altro? –
Le eccezioni del runtime erano la mia unica preoccupazione. Mi chiedevo se il doppio sempre riuscisse a decimali. – Lisa