我遇到了一个我认为应该有效的问题,但是会继续返回相同的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.
我试图保护它的方式有问题吗?
答案 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;