2016-11-09 38 views
-1

我用来初始化双变量为Double.NaN,稍后根据输入进行填充。如果输入错误,我只能返回Double.NaN。这种做法反其道而行之时,当其他部分的应用程序使用我的功能作为输入和工作就好了,做基本算术和比较NaNs与双(但不应该,我希望例外)。在java中初始化双变量的最安全的方法

明显的解决办法是在我的代码的末尾添加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 { 
... 
} 
+1

听起来好像你的设计中有一些非常错误的东西。你需要显示你的代码,以及你如何初始化和使用变量,如果你想要任何建议。 – Kayaman

+0

使用''null''作为Double的默认值有什么问题?为什么是'NaN'' ?! – f1sh

+0

@ f1sh不是'双','双'。 – Kayaman

回答

3

不要那样做。

NaN用于某些表达式的结果(例如0.0/0.0),并且具有其比较假与自身的独特属性

你应该总是初始化double值与明智的东西。根据你的算法,0.01.0通常是很好的价值。

如果你真的不能做到这一点,那么你可以总是使用Double,与null为默认初始化的值。

+0

我按要求添加了一个示例 如果我不知道输入和可能的输出使用情况,很难想出合理的。 – RInatM

+1

在这种情况下,您可能会使用'Double'和'null':查找从哈希映射不是特别便宜 - 尽管你的代码是“高度优化”的抗议,瓶颈将永远不会使用盒装类型。 – Bathsheba

+0

只是试图拿出一个简单的例子(代码中没有Hashmaps) 哪个更好 - 使用Double或添加额外的检查Double.isNaN? – RInatM

-1

使用盒装类型Double并使用null作为默认值Double.NaN。如果我需要坚持原语,我会得到0.0d作为默认值。

+1

对于原始类型你不能这么做,但对盒装模拟器来说这是个好主意。 – Bathsheba

+0

@Bathsheba好吧,OP没有说明他是否使用了primitve或者boxed类型,但是他强烈建议他使用boxed,因为他想用'Double.NaN'。 – Antoniossss

+1

如果你用该评论澄清你的答案,downvoter(不是我)可能会收回。 – Bathsheba

1

在使用它们之前,您应该始终验证您的输入。如果您的输入无效,则可以在完成任何计算之前投出IllegalArgumentException。它使调用者有责任使用正确的输入代码。

快速失败总是更好,而不是在整个系统中传播无效值。这可能会导致很大的问题(正如您可能遇到的那样)。