为什么0/0是NaN,但0/0.00不是?

14

使用DataTable.Compute,并编写了一些测试用例:

dt.Compute("0/0", null); //returns NaN when converted to double

dt.Compute("0/0.00", null); //results in DivideByZero exception

我已经修改了我的代码来处理这两种情况。但很好奇这里到底发生了什么?

1个回答

6
我猜这是因为带小数点的字面量被视为 System.Decimal,引起了 DivideByZeroException 根据 DataColumn.Expression
整数字面值 [+-]?[0-9]+ 被视为 System.Int32, System.Int64System.Double 没有科学计数法但带有小数点的实数字面值被视为 System.Decimal。如果数字超过 System.Decimal 支持的最大或最小值,则解析为 System.Double 根据 DivideByZeroException :
当试图用零除整型或 Decimal 值时抛出此异常。
对于 System.Double,它返回 NaN,因为如果操作是除法且常量是整数,则将其更改为双精度结果类型,参见 参考源 (感谢 @steve16351 的发现)。

我也这样想,但有些不对劲的地方:文档说明“DataSet将首先尝试将数字解析为Int32。这不会成功,因为数字太大。在这种情况下,DataSet将解析数字为Int64,这将成功。如果文字是一个比Int64的最大值还要大的数,DataSet将使用Double解析文字。”由于 0 可以放入 Int32 中,所以 "0/0" 的计算也应该导致除以零异常,而不是 NaN ,后者只能通过将表达式视为 System.Double 来解释。 - Zohar Peled
对于 System.Double,除以零的结果不是 Infinity,而是 NaN(不是数字) - Zohar Peled
2
查看DataTable表达式评估代码的相关部分,在第1053行,如果操作是除法且常量为整数,则明确更改为双精度结果类型,并注释“如果操作是除法,则结果应至少为双精度”。 - steve16351
@steve16351 我也在寻找相同的资源 :) - Pavel Anikhouski
@steve16351 虽然这提供了一个解释,但是在官方文档中看到一些解释会更好。否则,它是未记录的,因此不能保证在新版本中保持不变。 - Zohar Peled
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接