当前位置: 首页 > 面试题库 >

检查两个浮点/双精度值是否完全相等

施子民
2023-03-14
问题内容

比较两个浮点值以实现完全相等的一种优雅,易读且不冗长的方法是什么?

听起来很简单,但这是一个严重的问题。该==运营商没有得到楠所做的工作,也有特殊待遇的零:

(+0.0 == -0.0) -> true
Double.NaN == Double.NaN -> false

但我想,以确定是否两个值是完全一样的(但我 关心不同的NaN模式,所以任何的NaN ==任何其他男- >真)。

可以 使用这段丑陋的Monster代码 做到这一点:

Double.doubleToLongBits(a) == Double.doubleToLongBits(b)

有没有更好的方法来编写此代码(并使意图显而易见)?


问题答案:

我会说,您所拥有的已经是最好的方法。很明显,您对值的 按位 表示感兴趣。您碰巧将那些位转换long为没有任何时髦行为的便捷的64位类型。

如果您不希望它频繁出现在您的代码库中,只需添加一个包装方法即可:

html" target="_blank">public static boolean bitwiseEqualsWithCanonicalNaN(double x, double y) {
    return Double.doubleToLongBits(x) == Double.doubleToLongBits(y);
}

请注意,根据您的问题,这 不能
区分不同的NaN值。如果您想在以后进行此操作,则需要使用Double.toRawLongBits



 类似资料:
  • 问题内容: 如何使用正则表达式从字符串中提取双精度值。 问题答案: 这是简单的方法。请勿将regex用于内置类型。

  • 问题内容: 因此,我听说如果将2个字符串与==进行比较,则只有它们都引用相同的对象/实例时,我才会返回true。那是琴弦。布尔呢? 问题答案: ==是否检查布尔值是否完全相等?-Java 这取决于您是在谈论s(对象包装,请注意大写)还是s(原始,请注意小写)。如果您在谈论s(对象包装器),就像处理所有对象一样,请检查 身份 ,而不是对 等 。如果您在谈论s(基元),它将检查是否相等。 所以: 但

  • 问题内容: 如何使用正则表达式从字符串中提取双精度值。 问题答案: 是简单的方法。请勿将regex用于内置类型。

  • 问题内容: 是否有比浮点精度更好的数据类型? 问题答案: 小数数据类型 与基于硬件的二进制浮点数不同,十进制模块具有用户可更改的精度(默认为28位),可以与给定问题所需的精度一样大。 如果您对性能问题感到困扰,请查看GMPY

  • 我有一个Java类,下面是一个示例:

  • 问题内容: 我有这个问题,我必须将公里转换成英里。我是一个新手程序员,所以请耐心等待。 到目前为止,这是我的代码: 它给我一个错误,说: 问题答案: 您正在尝试将a 设置为变量 要修复,请更改此行 至