【问题标题】:Why do we have "is not a Number" (isNan) functions?为什么我们有“不是数字”(isNan)函数?
【发布时间】:2011-04-22 13:21:29
【问题描述】:

许多语言都有 isNaN() 函数。我在问自己:为什么要检查不是数字

原因纯粹是合乎逻辑的还是检查 not a number 而不是 is a number 更快?

注意这是一个纯粹的理解问题。例如,我知道我可以否定 isNaN() 来实现 isNumber() 函数。
但是,我正在寻找我们检查 不是数字的原因?

【问题讨论】:

    标签: numbers floating-point logic ieee-754


    【解决方案1】:

    NaN 用于:

    • 非实数或未定义值。
    • 错误处理。使用 NaN 初始化变量可让您测试 NaN 并确保已将其设置为有效值。
    • 忽略成员或属性的对象。例如,WPF 使用 NaN 来表示没有定义自己大小的可视元素的 Width 和 Height。

    【讨论】:

      【解决方案2】:

      检查它是否不是数字,因为假设它是一个数字。当您期望一个数值时,NaN 是一种例外情况,因此对我来说这样做是有道理的。毕竟,我宁愿不经常检查 isNaN 而不是经常检查值 isNum。

      【讨论】:

        【解决方案3】:

        isThisCaseExceptional 对我来说似乎比 isEverythingNormal 更合理,因为我可能会写

        possible_number = some_calculation();
        
        if (inNaN(possible_number)) handle_the_surprise;
        
        // .. keep going 
        

        而不是

        possible_number = some_calculation();
        
        if (inANumber(possible_number)) {
        
           // .. keep going 
        
        } else {
           // handle the surprise
        }
        

        【讨论】:

          【解决方案4】:

          如果计算结果不能用数字表示,许多语言都有特殊的表示,例如 NaN 和 Inf。所以 isNaN() 检查结果是否实际上是一个数字或 NaN 的特殊标记。

          【讨论】:

            【解决方案5】:

            'Not a Number' 是特定浮点计算的结果。这不是关于“嘿,这个变量是 120 还是“abc”?'

            【讨论】:

              【解决方案6】:

              这是一种报告错误情况(数学上未定义或超出技术限制)的方法。

              【讨论】:

                【解决方案7】:

                在计算中,NaN(非数字)是 数值数据类型的值 表示未定义的或 不可代表的价值,尤其是在 浮点计算。

                Wiki Article

                因为 Not a Number 是表达式的特例。

                你不能只使用 0 或 -1 或类似的东西,因为这些数字已经有意义。

                Not a Number 表示计算中出现问题,无法从中计算出有效数字。

                这与拥有null 的思路相同。当然,我们可以指定一个任意数值来表示 null,但这会令人困惑,而且我们会在极端情况下遇到各种奇怪的错误。

                【讨论】:

                  猜你喜欢
                  • 2014-12-13
                  • 2020-10-30
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-02-04
                  • 1970-01-01
                  • 2018-07-21
                  相关资源
                  最近更新 更多