我们有一份计算保证金的报告非常简单。我知道SSRS中没有IIF的短路。这个问题集中在为什么在公式中使用字段值和直接值之间存在行为差异。
=IIF(SUM(Fields!Sales.Value) = 0, "N/A", 1 - SUM(Fields!Cost.Value) / SUM(Fields!Sales.Value))
此公式在#error
时生成Sales.Value = 0
。但是,如果我将公式更改为以下内容:
=IIF(SUM(Fields!Sales.Value) = 0, "N/A", 1 - 1 / 0)
这导致"N/A"
喜欢它。所以1 - / 0
= -infinity
,但除以值为0的字段会导致错误。
为什么这里的行为不同?
编辑:我稍微澄清一下。如果我这样做,忽略IIF方面:
= 1 - 1 / 0
我得到-infinity
。如果我这样做(Sales.Value = 0):
= 1 -1 / Fields!Sales.Value
我得到#error
。
答案 0 :(得分:4)
基于VB documentation,Double
数据类型是唯一不会抛出DivideByZeroException
的数据类型。但是既然你已经清楚地使用了两个Int
,那么其他的东西就在这里。
经过一番搜索,我发现this answer是一个相关但不同的被零除的问题,这有很好的解释:
VB.NET做的事情略有不同;整数除法使用/
运算符自动生成浮点值。这是为了允许开发人员编写表达式1 / 2
,并将其评估为0.5
,有些人会认为这是直观的
TL; DR Fields!Sales.Value
可能被解释为Decimal
导致被零除#error
,而1 / 0
示例导致数据类型为{ {1}}并显示Double
。