web-dev-qa-db-ja.com

Java大きな10進数形式の例外

以下のコードがJava数値形式の例外をスローするのはなぜですか?

BigDecimal d = new BigDecimal("10934,375");

問題は、BigDecimalのコンストラクターが、小数点が小数点コンマ.ではなく小数点ドット,の直後に来る10進数形式を必要とするため、この特定の場合の正しい形式は次のようになることです。

BigDecimal d = new BigDecimal("10934.375");

はい、BigDecimalクラスは、このコンストラクターのJavadocで読み取ることができるように、Localeを受け取るコンストラクターでStringを考慮しません。

分数は、小数点とそれに続く0桁以上の小数で構成されます。

カンマを小数の区切り文字として使用する別のLocaleに従って解析する場合は、特定のLocaleとともにJava.text.DecimalFormatを使用する必要があります。

例:

DecimalFormat fmt = new DecimalFormat("0.0", new DecimalFormatSymbols(Locale.GERMAN));
fmt.setParseBigDecimal(true);
BigDecimal n = (BigDecimal) fmt.parse("10934,375");

DecimalFormatNumberFormatのサブクラス)のインスタンスを取得して、を呼び出すことができるようにする必要がありますメソッドsetParseBigDecimal。それ以外の場合は、代わりにDoubleを返します。これは2進浮動小数点数であり、2進浮動小数点数 多くの小数を正確に表すことはできません 。そのため、多くの場合、精度が低下します。

14
Erwin Bolwidt

NumberFormatを使用してロケールを選択できます。例を参照してください。

        String numberToFormat = "1.900,35";
        NumberFormat formatter = NumberFormat.getNumberInstance(Locale.GERMAN);
        Number number = formatter.parse(numberToFormat);
        BigDecimal decimal = BigDecimal.valueOf(number.doubleValue());
3
Raul Guiu