質問: (TextView) findViewById(R.id.TextView_view_point1); tv_point1.setText(String.valueOf(a2)); ``` 結果としては、例えば100,101,102...となっていた時、 3文字までと指定したときは100,100,100と表示されたり、4文字に増やしてみると100.,101.,102....というように小数点が残ってしまいます。 わかりにくい文章で申し訳ありません。ご指摘よろしくお願いします。
回答: ご質問のプログラム自体は以下のようにすれば期待どおりの結果になると思います。 `tv_point1.setText(String.valueOf((int)a2));` ただこうした計算にdoubleを使うことはあまりよくないと思うのでコメントします。 小数点以下の桁があるような数値を正確に扱いたい場合次のような戦略もあると思います。 * 文字列のまま扱う takitoさんがおっしゃっている文字として扱うときの一例です。数値型として値を10倍・10分の1にすると考えるのではなく文字列として表現されたもののまま小数点の文字を左右に移動すると考えます。 ``` // Stringとして表現した10進数sの小数点位置をn桁右へ移動する(n<0のときは左に移動) static String slideFloatingPoint(String s, int n) { int fp = s.indexOf('.'); String t = s.replace(".", ""); // 小数点を取り去る if (fp == -1) fp = t.length(); fp += n; while (fp <= 0) { fp++; t = "0" + t; } if (fp < t.length()) return t.substring(0, fp) + "." + t.substring(fp); while (fp > t.length()) { t = t + "0"; } return t; } ... String s1 = slideFloatingPoint("101", -1); // 10で割る(小数点を1桁左へ) // => s1 は "10.1"になる String s2 = slideFloatingPoint("10.1", 1); // 10かける(小数点を1桁右へ) // => s2 は "101"になる ``` * BigDecimalを使う 文字列としてではなく数値としても扱う必要があるなら何らかの数値型を使うことになりますが、**10進数として循環小数でない小数を正確に扱う**必要があるならdoubleは不適切でBigDecimalを使うのがよいと思います。 ``` // "101"(を数値として解釈したもの)を10で割る BigDecimal d1 = new BigDecimal("101").divide(BigDecimal.TEN); String s1 = d1.toString(); //=> d1は10.1に、s1 は "10.1"になる // "10.1"(を数値として解釈したもの)に10かける BigDecimal d2 = new BigDecimal("10.1").multiply(BigDecimal.TEN); String s2 = d2.toString(); //=> d2は101.0に、s2 は "101.0"になっちゃいます // d2の小数点以下の桁が不要だと分かっているとき int i3 = d2.intValue(); long l3 = d2.longValue(); String s3 = String.valueOf(l3); //=> i3とl3は101に、s3は"101"になる ``` 余談: doubleは科学技術計算など一定の誤差があることを許容するような計算に向いていますが、10進数での小数を正確に表現する必要がある場合は向きません。なぜなら計算機の中では我々が普段使う10進数ではなく2進数で数値を表現しており、10進数と2進数では同じ値でも循環小数になるかどうかが違うからです。例えば0.1は10進数では循環小数ではありませんが、2進数では循環小数(0.0001100110011001...)になります。 本件では整数を10で割ったりかけたりしており小数点数以下の値となったときに実は誤差が生じています。この程度だとdoubleを用いても10かけた結果は元の値と(多分)一致します。しかし元の値がlongの範囲だったり、100で割ったりかけたりすると期待外の結果になる場合が生じます。例えば以下のようなプログラムを動かすと"mismatch!"と印字されます。 ``` int i = 7; // 他に14,28,29,55,56,57,58,...なども結果が不一致になる double d = i / 100 * 100; if (i != d) { System.out.println("mismatch!"); } ``` doubleを使っても数値によっては期待通りに動いたりするのでバグに気が付きにくいのですが、いつか同じ考え方で100で割ったりかけたりするプログラムを書いたときに落とし穴にはまってしまうかも知れません。doubleを使っても問題ないかBigDecimalのようなものを使うべきかは意識しておいた方がよいと思います。