Androidアプリ作っててDouble型のデータ(緯度経度とか)をSharedPreferencesに保持したくなったのですが、putDouble()
がなかったので調べたまとめです。
ここでは3種類の方法について、よりナイスな順に並べると以下のようになります。
- long型のビット表現として保持する
- String型にして保持する
- float型にして保持する
特に最後の「float型にする」のは情報が失われる可能性がありバッドプラクティスなので要注意です。
long型のビット表現として保持する
詳しい説明はAndroid API Documentや、Java API Document(日本語かつこちらの方が詳細)を参照ください。(丸投げご免!)
そんなことよりサンプルコードです。
// 保存時
prefEditor.putLong(KEY_LATITUDE, Double.doubleToRawLongBits(location.getLatitude()));
// 取得時
latitude = Double.longBitsToDouble(preferences.getLong(KEY_LATITUDE, 0l));
String型にして保持する
これはまぁ説明不要かと思いますが、「とりあえず文字列に変換してしまえっ」という方法ですね。
StringからDoubleへの変換なんてキモチワルイし、内部的には1文字ずつ処理してるだろうし、そもそも変換できない文字列が入ってるかも…なんて色々考えることが多いのでスマートな解決法ではないねってことです。
そんなことよりサンプルry
// 保存時
prefEditor.putString(KEY_LATITUDE, location.getLatitude().toString());
// 取得時
try{
Double test = Double.parseDouble(preferences.getString(KEY_LATITUDE, "0"));
}catch(NumberFormatException e){
// TODO error hundling...
}
float型にして保持する
floatは4byteなのに対してDouble型は8byteあるので、単純に精度(precision)が欠落してしまう、という問題の他に、overflow/underflowなどの問題もあるので一見うまくいっているように見えても使わないほうがよいです。
このへんを読むとわかりやすいです。
そんなことよりry
使うなって言ってんだ最後まで言わせんな恥ずかしい!
まとめ
Double型ってそんなに使うことないと思いますが、思わぬ落とし穴に嵌らないように気をつけたいですね。
いじょ