在我的自定义函数中返回 double.NaN:这是一个好习惯吗?

Posted

技术标签:

【中文标题】在我的自定义函数中返回 double.NaN:这是一个好习惯吗?【英文标题】:Returning double.NaN in my custom function: is it a good practice? 【发布时间】:2019-01-18 04:19:21 【问题描述】:

(关于返回 NaN 有一个类似的问题,但它没有回答这个问题)

我是一个初学者编码器(因此总是不确定什么是好的做法)并且我正在编写一种方法来计算在 2d 空间中移动的某些对象的方向角(这是为了 Codingame 挑战)。为此,我写了一个方法

public static double GetAngle(double deltaX, double deltaY)

    if (deltaX==0 && deltaY==0) return double.NaN; //if not moving the direction is undefined
    //...
    //calculations etc
    return result;

这样返回 NaN 是一种好习惯吗?看起来方便且合乎逻辑(物体不动,因此没有速度,因此没有速度矢量),但不知何故,我觉得当这种方法用于其他计算时,它可能会导致以后很难发现一些错误(当然我会使用NaN 检查我记得但仍然存在的地方)。如有必要,此方法可以返回 0 而不是 NaN,我可以接受。

【问题讨论】:

你可以使用类似于 NET TryParse 方法并返回一个布尔值 谢谢,我会读到的。虽然我认为一个函数不应该根据条件返回两种不同的类型(如果我理解你的话)。 Int32.TryParse Method 微软认为还可以 我一定是误会了,我以为你的意思是让我在函数的 return 语句中放置一个 TryParse,这样它通常会返回一个双精度值,有时是一个布尔值。 不,更像是使用它作为模式:bool TryGetAngle(double X, double Y, out double angle) 【参考方案1】:

虽然在某些方面它是合乎逻辑的,但我建议更惯用的方法是使用Nullable<double>,也写为double?

public static double? GetAngle(double deltaX, double deltaY)

    if (deltaX == 0 && deltaY == 0)
    
        return null;
    
    // ...
    // Calculations etc
    return result;

这可能更符合您对其他代码表示“非结果”的方式。

除此之外,返回类型是 double? 而不是 double 的事实将迫使调用者考虑无结果选项 - 而调用返回 NaN 并最终传播的方法非常容易其他地方的 NaN 值是意外的。

【讨论】:

“除此之外” => 可能是这样使用它的原因, 哦!我没有那样想。我之前读到双精度数不能为空,所以我认为我应该使用 NaN(我认为这是对这些东西的空替换)。谢谢!【参考方案2】:

如果没有找到结果,我经常返回 null,并坚持始终使用 null。如果你不能在这里返回 null 然后使用 double.NaN

【讨论】:

谢谢,这是我在了解不可为空类型之前的意图。我认为是双倍的? Daisy Shipton 的建议在这里非常有效。

以上是关于在我的自定义函数中返回 double.NaN:这是一个好习惯吗?的主要内容,如果未能解决你的问题,请参考以下文章

nodejs中的自定义mysql函数返回未定义

将 Double.NaN 与自身进行比较

Sencha Touch - 为啥在我的自定义组件中未定义此功能?

(flex mobile)如何在我的自定义布局中添加元素

为啥我的自定义按钮的值不能保存在我的数据库中?

我的自定义单元格未显示在我的表格视图中