以下はde_DEのロケールのためのJ2SEとAndroidで異なる結果与える:JRE 1.6.0_22でString.format()バグ?
Locale locale = new Locale("de","DE");
log(String.format(locale,"%.1f", 0.45));
を予想通り、私は "0,5" を取得します。私はあなたが言う仕様に私を指す場合を除き、「0,4」
おかげで、ローランド
以下はde_DEのロケールのためのJ2SEとAndroidで異なる結果与える:JRE 1.6.0_22でString.format()バグ?
Locale locale = new Locale("de","DE");
log(String.format(locale,"%.1f", 0.45));
を予想通り、私は "0,5" を取得します。私はあなたが言う仕様に私を指す場合を除き、「0,4」
おかげで、ローランド
は、私がどの丸めモード、バグそれを呼び出すことはありません取得するAndroidプラットフォーム2.2で
String.format
メソッドを使用する必要があります。 1.6 JREはUPまたはHALF_UPをRoundingModeとして使用しているようです。ただし、Androidでは、HALF_EVENモードが使用されます。これは、DecimalFormatのデフォルトモードと思われます。これはJREで上記のテストに使用したコードです。
import java.util.Locale;
import java.text.DecimalFormat;
import java.math.RoundingMode;
public class Test {
public static void main(String [] args) {
Locale locale = new Locale("de","DE");
String str = String.format(locale,"%.1f", 0.45);
System.out.println(str);
System.out.println(String.format("%.1f", 0.45));
DecimalFormat df = new DecimalFormat("#.#");
System.out.println(df.format(0.45));
System.out.println(df.getRoundingMode());
df.setRoundingMode(RoundingMode.HALF_UP);
System.out.println(df.format(0.45));
}
}
ロケールは丸めモードとは関係がないようです。残念ながら、Androidでは、DecimalFormatは丸めモードをサポートしていないようですので、同じコードをそのまま実行することはできません。
JRE 1.5(丸めモードの設定はサポートしていません)でも同じコードを実行することに興味がありますが、私のマシンには適切な環境がありません。 Androidのためのソリューションが見つかり
:それは
// format
DecimalFormat df = new DecimalFormat("0.0");
BigDecimal valDec = new BigDecimal(String.valueOf(val));
BigDecimal roundedDec = valDec.setScale(1,BigDecimal.ROUND_HALF_UP);
return df.format(roundedDec.doubleValue());
はあなたがいない場合、あなたはいくつかの面白い値を取得しますので、二重の文字列表現をBigDecimalのをインスタンス化することが重要であると考えられます。 はここに例を示します
BigDecimal test = new BigDecimal(0.85);
Log.v(TAG,"BigDecimal: "+test.toPlainString());
----->のBigDecimal:0.84999999999999997779553950749686919152736663818359375
あなたは今、上記のコードを使用している場合は、もちろん、あなたが期待するものを、0.8と0.9でないを取得します。
ありがとう、ローランド