【问题标题】:Why 0/0 is NaN but 0/0.00 isn't为什么 0/0 是 NaN 而 0/0.00 不是
【发布时间】:2019-08-15 08:35:42
【问题描述】:

使用DataTable.Compute,并构建了一些案例进行测试:

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

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

我已更改我的代码来处理这两个问题。但是很想知道这里发生了什么?

【问题讨论】:

    标签: c# datatable double decimal formula


    【解决方案1】:

    我猜,这是因为带有小数点的文字被威胁为System.Decimal 并导致DivideByZeroException

    根据DataColumn.Expression

    整数文字 [+-]?[0-9]+ 被视为System.Int32System.Int64System.Double

    没有科学记数法但有小数点的实数, 被视为System.Decimal。如果数量超过最大值或 System.Decimal 支持的最小值,则将其解析为 System.Double.

    根据DivideByZeroException

    当试图分割一个 整数或Decimal 值为零。

    对于System.Double,它返回 Nan,因为如果运算是除法并且常量是整数,它会根据 reference source 更改为双精度结果类型(感谢 @steve16351 发现)

    【讨论】:

    • 我也在想同样的事情,但似乎有些不对劲:文档指出“DataSet 将首先尝试将数字解析为 Int32。这不会成功,因为数字太大。在这种情况下,DataSet 会将数字解析为 Int64,这将成功。如果字面量是大于 Int64 最大值的数字,DataSet 将使用 Double 解析字面量。由于0 确实适合Int32,"0/0" 的计算也应该导致除以零异常,而不是在NaN 中只能解释表达式被视为System.Double
    • 对于System.Double,除以零的结果不是Infinity,而是NaN(不是数字)
    • @ZoharPeled 是的,在这种情况下是 Nan,我已经更新了答案。一般来说:将浮点值除以零不会引发异常;根据 IEEE 754 算术规则,它会导致正无穷大、负无穷大或非数字 (NaN)。
    • 是的,但这仍然不能解释为什么 "0/0" 被视为 double 而不是 int 0 除以 int 0。
    • 查看DataTable 表达式评估代码的relevant part 第 1053 行,如果运算是除法且常量是整数,它会显式更改为双精度结果类型,并带有注释“如果运算是除法,则结果应至少为双倍”。
    猜你喜欢
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-18
    • 2013-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多