この記事は Androidスマホ用のアプリ開発の中で、
今後の開発で再使用性が高いと思われるコーディングをまとめたものです。
Java での開発経験、XML構文規則、Android のアプリ開発経験がある方を対象としています。
Android のアプリ開発でお役にたててれば、嬉しいです。
(これから Android のアプリ開発や Java での開発を始めたい方への案内は、記事の最後で紹介します)
計算に特化したコンピュータといえば電卓、デスクに1台欲しいですね!
ポイント
小数点以下の数値を含む演算での数値は2進数で表現され、演算自体も2進数で行います。
2進数で表現できない数値は近似値で扱われ、これが誤差が生じる原因です。
小数点以下の誤差を許容できい場合は任意精度の符号付き10進数を扱えるBigDecimalを使用します。
今回はBigDecimalを使用して、有効桁数の範囲で誤差が発生しない演算の実装について説明します。
BigDecimal
サンプルはGPS位置情報(緯度・経度)を引数(adjust)で位置を移動させるコードです。
緯度・経度の位置を約40㎝のメッシュで管理する場合、小数点以下6桁の数値となります。
緯度・経度を約40cm移動する場合、引数(adjust)に0.000001をセットします。
この演算をdoubleで演算すると、丸め誤差によって正確な演算結果が得れません。
演算する数値をBigDecimalでインスタンス化し、addで加算します。
private ArrayList<String> arrayLogs;
:
private void moveArrayLogs(String[] adjust) {
ArrayList<String> arrayList = arrayLogs;
BigDecimal[] bd2 = {new BigDecimal(adjust[0]), new BigDecimal(adjust[1])};
double[] gy = {0};
String[] data;
arrayLogs = new ArrayList<>();
for (int i = 0; i < arrayList.size(); i++) {
data = arrayList.get(i).split("\t");
BigDecimal[] bd1 = {new BigDecimal(data[1]), new BigDecimal(data[2])};
BigDecimal[] pos = {bd1[0].add(bd2[0]), bd1[1].add(bd2[1])};
:
arrayLogs.add(String.format(Locale.getDefault(), "%s\t%.7f\t%.7f\t%s\t%s\t%s\t%s\t%s\t%s\t%s", data[0], pos[0].doubleValue(), pos[1].doubleValue(), data[3], data[4], data[5], data[6], data[7], data[8], data[9]));
}
:
}
:
arrayLogsは緯度・経度を含むタブ区切りの文字列配列です。
サンプルではarrayLogsに演算結果を反映しています。
今回は、ここまでです。
浮動小数点演算の誤差対応しているAndroidアプリです。
誤字脱字、意味不明でわかりづらい、
もっと詳しく知りたいなどのご意見は、
このページの最後にあるコメントか、
こちらから、お願いいたします♪
ポチッとして頂けると、
次のコンテンツを作成する励みになります♪
これからAndroidのアプリ開発やJavaでの開発を始めたい方へ
アプリケーション開発経験がない方や、アプリケーション開発経験がある方でも、Java や C# などのオブジェクト指向言語が初めての方は、Android のアプリ開発ができるようになるには、かなりの時間がかかります。
オンラインスクールでの習得を、強くおススメします。
未経験者からシステムエンジニアを目指すのに最適です。まずは無料相談から♪
未経験者からプログラマーを目指すのに最適です。まずは無料カウンセリングから♪
カリキュラムとサポートがしっかりしています。お得なキャンペーンとかいろいろやっています♪
ゲーム系に強いスクール、UnityやUnrealEngineを習得するのに最適です。まずは無料オンライン相談から♪
参考になったら、💛をポッチとしてね♪
コメント欄