Нет , в общем случае приведение от двойного к десятичному не является всегда безопасным :
[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!
}
Как указано в ОП,комментарий к вопросу, что « safe » означает «, не вызывает исключений времени выполнения », приведенное выше показывает, что исключения могут возникнуть при приведении двойного числа кдесятичный.
Выше приведен общий ответ, к которому многие гуглеры могли бы прийти сюда.Тем не менее, чтобы ответить на вопрос * , заданный OP, есть убедительный признак того, что код не будет генерировать исключения, даже в крайних случаях:
[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;
}
}