2016-02-23 114 views
1

我正在实施比较器为一类,而重写比较,我有一个问题。Java双NaN比较

double data1 = GetValueOf(Data1); 
double data2 = GetValueOf(Data2); 
int compareResult = Double.compare(data1, data2); 

如果data1和/或data2是NaN会发生什么?

这仍然是一个有效的比较来执行?

UPDATE 我不明白为什么这个问题被降级。只是为了解释我自己,我面临着“Comparison method violates general contract”的问题。

我这样做...

if(Double.isNaN(data1)) data1 = Double.Positive_Infinity; 
if(Double.isNaN(data2)) data2 = Double.Positive_Infinity; 

的Double.compare前,但仍收到此错误。

所以,我需要了解是否有一些基本的东西我不理解。

+0

您是否阅读过Java语言规范以查找答案? –

+1

如果你正在重写'compare()'从'比较器'你只有你负责验证和比较数据。技术是不负责任何**如果在比较过程中发现任何无效数据引发'Exception' –

+0

@JimGarrison ,我没有检查java文档,但我想要使用Double.compare的意见。 – KSK

回答

3

无序的结果是,如果您将NAN与自身进行比较,则返回结果。 Java的document说:

是溢出的操作产生一个符号无穷,即溢产生一个非标准化的值或符号零,而且没有明确的数学结果的 操作的操作 产生NaN的。所有的 以NaN作为操作数的数字操作都会产生NaN。由于 已经被描述,所以NaN是无序的,所以涉及一个或两个NaN的数值比较 返回false,并且涉及NaN的任何!= 比较返回true,包括当x是NaN时的x!= x。