如何在SharedPreferences中保存可累加的十进制数?
嘿,这个需求很好解决!原来你用SharedPreferences的putInt()存整数积分,现在要支持十进制数(也就是浮点数)的话,SharedPreferences本身就提供了对应的存储方法,下面给你两种实用方案:
方案1:直接用浮点类型存储(适合大多数积分场景)
SharedPreferences支持float类型的存储和读取,用putFloat()和getFloat()就能搞定,步骤如下:
- 修改变量类型:把原来的
int pointsAmount改成float pointsAmount(如果需要更高精度也可以用double,但注意SharedPreferences没有直接的putDouble(),要么转成float,要么用后面的字符串存储方案)。 - 累加十进制积分:比如你要加10.5积分,就写
pointsAmount += 10.5; - 格式化显示:为了避免显示杂乱的小数位,用
String.format()控制格式,比如保留1位小数:pointsAvailable.setText(String.format("C.%.1f", pointsAmount)); - 保存到SharedPreferences:替换原来的
putInt()为putFloat(),另外推荐用apply()代替commit()——apply()是异步操作,不会阻塞主线程,更高效:SharedPreferences saveCoins = this.getSharedPreferences("mySaverCoins", Context.MODE_PRIVATE); saveCoins.edit().putFloat("points_amount", pointsAmount).apply(); - 读取保存的值:在应用启动时读取,用
getFloat(),第二个参数是默认值(比如0.0f):SharedPreferences saveCoins = this.getSharedPreferences("mySaverCoins", Context.MODE_PRIVATE); float pointsAmount = saveCoins.getFloat("points_amount", 0.0f); pointsAvailable.setText(String.format("C.%.1f", pointsAmount));
方案2:用整数存储(避免浮点精度误差,适合精确计算场景)
如果你的积分涉及到非常精确的计算(比如和金钱挂钩),浮点类型可能会有精度丢失的问题(比如0.1+0.2不等于0.3)。这时候可以把十进制数转成整数存储,比如把积分乘以10(保留1位小数)或者100(保留2位小数),读取的时候再转回来:
- 保存时转成整数:
// 假设pointsAmount是10.5,转成整数105 int pointsInUnits = (int) (pointsAmount * 10); SharedPreferences saveCoins = this.getSharedPreferences("mySaverCoins", Context.MODE_PRIVATE); saveCoins.edit().putInt("points_in_units", pointsInUnits).apply(); - 读取时转回十进制:
SharedPreferences saveCoins = this.getSharedPreferences("mySaverCoins", Context.MODE_PRIVATE); int pointsInUnits = saveCoins.getInt("points_in_units", 0); float pointsAmount = pointsInUnits / 10.0f; pointsAvailable.setText(String.format("C.%.1f", pointsAmount));
小提醒
- 原来的键名是
"C.",建议换成更清晰的名字(比如"points_amount"),避免混淆和后续维护问题。 - 如果用
double类型,也可以转成字符串存储(用putString()和getString()),读取时再用Double.parseDouble()转回来,这样精度更高。
内容的提问来源于stack exchange,提问作者everjoym
相关产品推荐
相关产品推荐

