出现错误,这种类型的 sharedPreferences 编辑器的 put double 方法未定义。Eclipse 提供了一个快速修复添加强制转换到编辑器,但是当我这样做时它仍然给出错误,为什么我不能放 double。
代码:
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
if (TextUtils.isEmpty(editBl.getText().toString())) {
numberOfBl = 0;
} else {
numberOfBl = Integer.parseInt(editBl.getText().toString();
}
if (TextUtils.isEmpty(editSt.getText().toString())) {
tonOfSt = 0;
} else {
tonOfSt = Double.parseDouble(editSt.getText().toString());
}
SharedPreferences prefs = getSharedPreferences(
"SavedTotals", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putInt("savedBl", numberOfBl);
editor.putDouble("savedSt", tonOfSt);
editor.commit();
}
最佳答案
不幸的是,那些建议使用 putFloat 和 getFloat 的人大错特错。将 double 转换为 float 会导致
- 丢失精度
- 溢出
- 下溢
- 死猫
那些建议 toString 和 parseString 的人并没有错,但这是一个低效的解决方案。
处理这个问题的正确方法是将 double 转换为其“原始长位”等效值并存储该长整数。当您读取该值时,将其转换回双倍。
因为这两种数据类型具有相同的大小,所以不会丢失精度,也不会导致 {over,under}flow。
Editor putDouble(final Editor edit, final String key, final double value) {
return edit.putLong(key, Double.doubleToRawLongBits(value));
}
double getDouble(final SharedPreferences prefs, final String key, final double defaultValue) {
return Double.longBitsToDouble(prefs.getLong(key, Double.doubleToLongBits(defaultValue)));
}
或者,您可以将 getter 编写为:
double getDouble(final SharedPreferences prefs, final String key, final double defaultValue) {
if ( !prefs.contains(key))
return defaultValue;
return Double.longBitsToDouble(prefs.getLong(key, 0));
}
关于android - 不能放双 SharedPreferences,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16319237/