SharedPreferences无putDouble方法,Double相加异常及改后崩溃求助
嘿,我太懂你卡了两小时还搞不定的崩溃心情了!先帮你拆解核心问题,再给你落地的解决方案:
核心问题根源
你猜的没错——SharedPreferences确实没有原生的putDouble()/getDouble()方法,很多人会用「Double转String再存」的方式,但这里很容易踩三个坑:
- 转String时的精度丢失:比如某些Double值转String后会变成科学计数法,或者截断部分小数位,转回Double就不是原来的值了;
- 字符串拼接错误:如果存的时候不小心把其他字符和Double值拼在一起(比如
"数值:" + myDouble),取回来解析Double就会直接炸; - 空指针/默认值缺失:如果没存过对应Key的值,
getString会返回null,直接parseDouble就会崩溃。
两种靠谱的SharedPreferences存Double方案
方案1:用Long中转(无损精度,推荐!)
利用Double.doubleToRawLongBits()把Double转成Long(这是无损转换,不会丢精度),存Long类型,取的时候再转回来:
// 存Double值到SharedPreferences SharedPreferences prefs = getSharedPreferences("YourPrefsName", MODE_PRIVATE); prefs.edit() .putLong("brixdone2", Double.doubleToRawLongBits(brixdone2)) .putLong("milkdone2", Double.doubleToRawLongBits(milkdone2)) .apply(); // 优先用apply()异步提交,比commit()更高效 // 从SharedPreferences取Double值 double brixVal = Double.longBitsToDouble(prefs.getLong("brixdone2", 0L)); // 第二个参数是Key不存在时的默认值 double milkVal = Double.longBitsToDouble(prefs.getLong("milkdone2", 0L)); double sum = brixVal + milkVal; // 这下加法结果就正常了
方案2:用String存取(需做好异常处理)
如果一定要用String,必须保证转存和解析的严谨性,避免崩溃:
// 存的时候用String.valueOf(),别自己手动拼接! prefs.edit() .putString("brixdone2", String.valueOf(brixdone2)) .putString("milkdone2", String.valueOf(milkdone2)) .apply(); // 取的时候必须处理null和格式异常 String brixStr = prefs.getString("brixdone2", "0.0"); // 给默认值避免拿到null String milkStr = prefs.getString("milkdone2", "0.0"); try { double brixVal = Double.parseDouble(brixStr); double milkVal = Double.parseDouble(milkStr); double sum = brixVal + milkVal; // 这里处理你的加法结果逻辑 } catch (NumberFormatException e) { // 万一存的字符串不是合法数字,这里做容错处理(比如给默认值、提示用户) e.printStackTrace(); }
针对你的崩溃问题排查点
改代码后崩溃,大概率是以下两种情况,去Logcat里看崩溃栈就能快速定位:
- NullPointerException:取String时没给默认值,且Key不存在,拿到null后直接
parseDouble导致崩溃; - NumberFormatException:存的String不是纯数字(比如不小心拼了其他字符),解析时出错。
最后小提醒
- 存和取的Key必须完全一致,别打错字!
- 优先用方案1,完全避免String转换的各种坑,精度还能100%保证。
内容的提问来源于stack exchange,提问作者danilkp1234
相关产品推荐
相关产品推荐

