フロートを文字列にキャストするときは、ラウンド数を避ける必要があります。数がまったく同じである必要があります。
この瞬間に私がこれを作ると:
String value = String.valueOf(1234567.99);
値=1234568.0なので、キャスト後に値=1234567.99が必要です。
1234567.99
フロートとして正確に表すことはできません。最も近いフロートは実際には1234568に等しいです。
より高い精度が必要な場合は、doubleを使用できます1234567.99d
。期待どおりに動作します。
この簡単なテストを実行して確認できます(Javaの場合ですが、Androidではを置き換えることで簡単にトランスポゾンできますprintln
)。
public static void main(String[] args) {
float f = 1234567.99f;
double d = 1234567.99d;
System.out.println(new BigDecimal(f));
System.out.println(new BigDecimal(d));
}
プリント:
1234568
1234567.98999999999068677425384521484375
注:String.valueOf(double)
同じdoubleの、小数点以下の少ない別の表現にdoubleを丸めます。つまり、上記のよう1234567.99d
にdoubleとして表すことはできず、最も近いdoubleは1234567.98999999999068677425384521484375
です。しかしString.valueOf
、言語の仕様によれば、それらは事実上同じdoubleであるため、それを理解し、そのdoubleの最初の表現(小数点以下2桁のみ)を使用します。
String.valueOf()
他の問題がある数値を四捨五入することはありませんが、次のように試すことができます。
String value = ""+1234567.99;
String s = Double.toString(1234567.99);
更新:文字列の形式をより細かく制御するには、DecimalFormatとDecimalFormatSymbolsを使用します
例えば:
java.text.DecimalFormat formater = new java.text.DecimalFormat();
formater.setMinimumFractionDigits(0);
formater.setMaximumFractionDigits(3);
formater.setGroupingUsed(false);
java.text.DecimalFormatSymbols dfs = new java.text.DecimalFormatSymbols();
dfs.setNaN("NaN");
formater.setDecimalFormatSymbols(dfs);
String s = formater.format(1234567.99);