保护零除零

时间:2016-11-11 17:55:48

标签: c#

我遇到了一个我认为应该有效的问题,但是会继续返回相同的Divide by Zero错误。

以下是我正在使用的代码,我认为应该防范它:

GoalBarValue = Convert.ToInt32(((decimal)CompletedToday / 
((decimal)CompletedYesterday) == 0 ? (decimal?)null : (decimal)CompletedYesterday) 
* 100);  // Divide by zero protection

CompletedToday comes back as 0
CompletedYesterday comes back as 0

这完全没问题,正如我预期的那样。

返回的具体错误是Attempted to divide by zero.

我试图保护它的方式有问题吗?

2 个答案:

答案 0 :(得分:4)

“我试图防范它的方式有问题吗?”

是的,实际上,你除以零! 0可以作为计算结果的唯一方法是CompletedToday为0.在另一种情况下,除以0得到漂亮的异常。为什么不检查除数是否为0,如果不执行计算,则给它一个null

GoalBarValue = Convert.ToInt32((decimal)CompletedYesterday) == 0 ?
               (decimal?)null : (decimal)CompletedYesterday * 100;

想象一下,你会检查是否将头靠在墙上撞到墙上......这是不可取的。

编辑:

如果您想要2个不同变量的分配(正如您在评论中所写的那样),那么? operator对您没什么用处。它只允许1。

我建议坚持旧时尚的方式。如果你真的想在一行中分配两个作业:

if((decimal)CompletedYesterday) == 0)
    GoalBarValue = CompletedYesterday = null;
else  GoalBarValue = // what ever you want to calculate...

答案 1 :(得分:3)

这是你想要的吗?

if (Convert.ToDecimal(CompletedYesterday) == 0)
{ 
    goalBarValue = null;
}
else
{
    goalBarValue = Convert.ToInt32(Convert.ToDecimal(CompletedToday)/Convert.ToDecimal(CompletedYesterday)) * 100;
}

以上代码的一行版本

goalBarValue = Convert.ToDecimal(CompletedYesterday) == 0 ? null : Convert.ToInt32(Convert.ToDecimal(CompletedToday)/Convert.ToDecimal(CompletedYesterday)) * 100;