我曾经用Double.NaN
初始化双变量,然后根据输入填充它们。如果输入中有错误,我只返回Double.NaN
。这种做法适得其反,当应用程序的其他部分使用我的函数作为输入并且工作正常时,进行基本算术并将NaNs
与double进行比较(但是我没想到会有异常)。
显而易见的解决方案是在我的代码末尾添加Double.isNaN()
并在我的函数中抛出异常
但这是高度优化的代码中一个高度使用的功能,因此我不愿意在每次调用时添加额外的检查。我宁愿每年一次在错误的参数上打破整个应用程序而不是添加额外的检查,尤其是。我听说与NaN
相比,花费的时间要长于双倍。在这种情况下,我如何实现这一目标以及最佳做法是什么?
修改 例如,我想返回参数函数的第一个参数,我根据用户输入一无所知
private double getFirstFactor(HashMap <String, Double> userParams) {
double res = Double.NaN;
if(userParams.containsKey("factor1")) {
res = userParams.get("factor1");
}
return res;
}
用法
double f1 = getFirstFactor(userParams);
double threshold = f(f1); // for example f1 * 100 + f1;
// ideally, code above breaks if f1 is not defined and I don't go futher
if(threshold >= 0) {
...
} else {
...
}
答案 0 :(得分:3)
不要这样做。
NaN
用于某些表达式的结果(例如0.0 / 0.0
),并具有唯一属性,它将false与自身进行比较。
你应该总是用合理的东西初始化double
值。根据您的算法,0.0
和1.0
通常是很好的值。
如果确实无法做到这一点,那么您可以随时使用Double
,null
作为默认初始值。
答案 1 :(得分:1)
在使用之前,您应始终验证输入。如果输入无效,则可以在完成任何计算之前抛出IllegalArgumentException
。它使调用者有责任使用正确的输入代码。
最好快速失败,而不是在整个系统中传播无效值。这可能会导致很大问题(正如您可能经历过的那样)。
答案 2 :(得分:-1)
使用盒装类型Double
并使用null
作为Double.NaN
的默认值。如果我需要坚持原语,我会将0.0d
作为默认值。