You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SharedPreferences无putDouble方法,Double相加异常及改后崩溃求助

解决Double加法异常&SharedPreferences存取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:03:32