【问题标题】:Java Double NaN comparison for sort用于排序的 Java Double NaN 比较
【发布时间】:2016-06-04 21:10:51
【问题描述】:

我正在为一个类实现 Comparator,在覆盖 compare 时,我有一个问题。

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

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

这仍然是一个有效的比较吗?

更新 我不明白为什么这个问题被低估了。只是为了解释一下,我正面临一个“Comparison method violates general contract”的问题。

我正在这样做……

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

在 Double.compare 之前,但仍然出现此错误。

所以,我需要了解是否有一些我不了解的基本内容。

【问题讨论】:

  • 您是否阅读了 Java 语言规范以找到答案?
  • 如果您覆盖compare() From Comparator 您并且只有您负责验证和比较数据。Technology 不负责IF在比较过程中发现任何无效数据提出了Exception
  • @JimGarrison,我确实检查了 java 文档,但我想对使用 Double.compare 提出意见。
  • 您是否阅读了它所引用的Double.compareDouble.compareTo 的Javadocs? NaN 处理是否适合您,只有您可以根据数据结构的要求来确定。

标签: java double nan comparator


【解决方案1】:

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

溢出的运算产生有符号无穷大,运算 下溢产生非规范化值或有符号零,以及 没有数学上明确结果的运算会产生 NaN。全部 以 NaN 作为操作数的数值运算会产生 NaN 作为结果。作为 已经描述过了,NaN 是无序的,所以一个数值比较 涉及一个或两个 NaN 的操作返回 false 和任何 != 涉及 NaN 的比较返回 true,当 x 为 NaN 时,包括 x!=x。

【讨论】:

    猜你喜欢
    • 2016-08-20
    • 2013-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多