C# 为什么0/0是NaN而0/0.00不是';T

C# 为什么0/0是NaN而0/0.00不是';T,c#,datatable,double,decimal,formula,C#,Datatable,Double,Decimal,Formula,使用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处理,并导致被零除异常 据 整

使用
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
处理,并导致
被零除异常

整数文本[+-]?[0-9]+被视为
System.Int32
System.Int64
System.Double

不带科学符号但带小数点的实文字, 被视为
System.Decimal
。如果数量超过最大值,或
System.Decimal
支持的最小值,然后将其解析为
System.Double

根据

试图分割数据时引发的异常 整数或
十进制
值乘以零


对于
System.Double
它返回Nan,因为如果运算是一个除法,常数是整数,它将变为双结果类型,根据(感谢@steve16351的发现)

我也在想同样的事情,但有些事情似乎不正确:文档状态“数据集将首先尝试将数字解析为Int32。这不会成功,因为该数字太大。在本例中,DataSet将把数字解析为Int64,这将成功。如果文本大于Int64的最大值,DataSet将使用Double解析文本。“由于
0
适合Int32,因此
的计算将为0/0。”“
也应导致零除异常,而不是在只能解释表达式的
NaN
中被视为
系统。Double
。对于
系统。Double
零除的结果不是
无限
,而是
NaN
(不是数字)@ZoharPeled是的,在这种情况下是NaN,我已经更新了答案。一般来说:浮点值除以零不会引发异常;根据IEEE 754算术规则,它会产生正无穷大、负无穷大或不是一个数字(NaN)。是的,但这仍然不能解释为什么
“0/0”
被视为double,而不是int 0除以int 0。查看
数据表的1053行
表达式求值代码,如果操作是一个除法且常数是整数,则它将明确更改为双精度结果类型,并带有注释“如果操作是一个除法,则结果应至少为双精度”。