使用DataTable.Compute
,并编写了一些测试用例:
dt.Compute("0/0", null); //returns NaN when converted to double
dt.Compute("0/0.00", null); //results in DivideByZero exception
我已经修改了我的代码来处理这两种情况。但很好奇这里到底发生了什么?
System.Decimal
,引起了 DivideByZeroException
根据 DataColumn.Expression
:System.Int32
, System.Int64
或 System.Double
没有科学计数法但带有小数点的实数字面值被视为 System.Decimal
。如果数字超过 System.Decimal
支持的最大或最小值,则解析为 System.Double
根据 DivideByZeroException :Decimal
值时抛出此异常。System.Double
,它返回 NaN,因为如果操作是除法且常量是整数,则将其更改为双精度结果类型,参见 参考源 (感谢 @steve16351 的发现)。
0
可以放入 Int32 中,所以"0/0"
的计算也应该导致除以零异常,而不是NaN
,后者只能通过将表达式视为System.Double
来解释。 - Zohar PeledSystem.Double
,除以零的结果不是Infinity
,而是NaN
(不是数字) - Zohar PeledDataTable
表达式评估代码的相关部分,在第1053行,如果操作是除法且常量为整数,则明确更改为双精度结果类型,并注释“如果操作是除法,则结果应至少为双精度”。 - steve16351