无法从存储中保存和检索 Double

Unable to save and retreive Double from storage

我总是遇到这个错误java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long

  val sharedPreferences = getSharedPreferences("prefs", MODE_PRIVATE)
  val editor = sharedPreferences.edit()
  var myLongitude = 36.892672
  editor.putDouble("longitude", myLongitude)
  editor.apply()

错误来自这里:

val savedLongitude : Double = sharedPreferences.getDouble("longitude", 0.0)

我有这些方法:

 fun SharedPreferences.Editor.putDouble(key: String, double: Double) =
          putLong(key, java.lang.Double.doubleToRawLongBits(double))

  fun SharedPreferences.getDouble(key: String, default: Double) =
          java.lang.Double.longBitsToDouble(getLong(key, java.lang.Double.doubleToRawLongBits(default)))

我的目标是将双精度值保存到 SharedPref,然后检索它

您可以使用很多优雅的方法。 这是 java 的变体。但是如果你使用 kotlin,你可以使用扩展来让它更清晰。

Kotlin 扩展方式(比使用奇怪的实用程序 类 或其他任何东西更漂亮)

fun SharedPreferences.Editor.putDouble(key: String, double: Double) =
    putLong(key, java.lang.Double.doubleToRawLongBits(double))

fun SharedPreferences.getDouble(key: String, default: Double) =
    java.lang.Double.longBitsToDouble(getLong(key, java.lang.Double.doubleToRawLongBits(default)))

enter link description here

这样做是为了将双倍值存储到首选项

 final Editor editor = getPreferences().edit();
 editor.putLong(key, Double.doubleToRawLongBits(value));
 editor.apply();

Double.doubleToRawLongBits() 是

Returns a representation of the specified floating-point value according to the IEEE 754 floating-point "double format" bit layout, preserving Not-a-Number (NaN) values.

要从首选项中获得双倍价值,请使用此

Double.longBitsToDouble(getPreferences().getLong(key, Double.doubleToLongBits(defValue)));