2010-11-30 9 views
2

以下は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」

おかげで、ローランド

答えて

3

は、私がどの丸めモード、バグそれを呼び出すことはありません取得する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のためのソリューションが見つかり

0

:それは

// 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でないを取得します。

ありがとう、ローランド