【问题标题】:When should I use Double.longBitsToDouble(...) instead of simply casting long to a double?我什么时候应该使用 Double.longBitsToDouble(...) 而不是简单地将 long 转换为 double?
【发布时间】:2012-06-16 20:38:12
【问题描述】:

我有一个 double 值数组,其中最后一个值实际上是一个 long 表示时间(以毫秒为单位)。因此,需要将这个 long 转换为 double 以适合数组。稍后在检索此 long 值时,需要将其转换回 long 类型。至关重要的是,从双精度数组中检索后的 long 值与将其放入数组之前的值完全相同(低至一毫秒)。在数组中,不会对 long 值执行任何操作。所以问题是:
我应该简单地将 long 值转换为 double 并在检索时将其转换回 long 吗?这会保留我多头的确切价值吗?
或者我应该使用 Double.longBitsToDouble(time) 方法将 long 放入数组并使用 Double.doubleToLongBits(time) 检索它。
或者也许我应该使用 Double.longBitsToDouble(time) 将 long 值放入数组中,并通过简单地将其转换为 long 类型来检索编码的 long?
提前感谢您的帮助。

【问题讨论】:

  • “我有一个 double 值数组,其中最后一个值实际上是一个 long 表示时间(以毫秒为单位)。”停在那儿。糟糕的设计。不要那样做。

标签: java casting type-conversion primitive-types


【解决方案1】:

我的意思是,你应该做的是使用数组来表示不同的值...

但听上去,您别无选择,只能使用Double.longBitsToDouble,因为double 无法为您提供所有long 值的完全精确度。仅将 long 转换为 double 将失去精度。

【讨论】:

  • @PiotrFindeisen:错了。 Double.doubleToRawLongBits 用于向后转换,除非您希望将技术上为 NaNs 的所有值合并在一起。
  • 谢谢路易斯,我同意 - 我不应该这样做,但请注意我对埃文回答的评论。因此我会选择 Double.longBitsToDouble 和 Double.doubleToRawLongBits。
  • 哦,感谢您在评论中使用 Double.doubleToRawLongBits 检索正确值的评论 - 否则我可能会使用 Double.doubleToLongBits 这还不够好。顺便说一句,如果这就是 Double.doubleToLongBits 的行为,为什么会有人想要合并两种不同类型的 NaN?我看不出这种方法的用处。当您更喜欢 doubleToLongBits 而不是 doubleToRawLongBits 时有什么评论?
  • 例如,如果你想测试两个双精度数是否相等,或者都是 NaN,那么这相当于 Double.doubleToLongBits(a) == Double.doubleToLongBits(b)
  • 所以如果我做对了:而不是说 if(a == b || (a == Double.NaN && b == Double.NAN)) 我可以说 if(Double.doubleToLongBits (a) == Double.doubleToLongBits(b)) ?但如果这是唯一的原因,这种方法的用处仍然值得怀疑。
【解决方案2】:

我将创建一个自定义类,该类基本上是double 数组和单个long 值的容器。切勿使用数组来存储不同类型的数据,或者将数组的某些元素用于不同目的。

使用List<double> 的示例:

public class DoublesWithTimestampStructure
{
    private List<double> doubles;
    private long timestamp;

    public DoublesWithTimestampStructure()
    {
        this.doubles = new List<double>();
        this.timestamp = 0;
    }

    /*
    ... getter and setter methods, miscellaneous methods, etc.
    */
}

【讨论】:

  • 谢谢,我正在考虑这个解决方案,但现在实施起来可能很昂贵,因为我的应用程序已经严重依赖这个数组(实际上是数组),并将数组包装到一个对象中可能会使事情复杂化。除此之外,数组中的这个时间元素只是一个可选元素,所以我宁愿在 Javadoc 中添加一个注释,即为了正确检索这个时间值,必须使用 Double.doubleToRawLongBits,如下面的 Louis 建议的那样。虽然你的答案不是我问题的答案,但我通常同意你的观点,因此被赞成。
猜你喜欢
  • 1970-01-01
  • 2013-07-10
  • 1970-01-01
  • 2016-08-09
  • 2011-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多