Java大十进制数格式异常

时间:2014-03-17 12:21:29

标签: java exception bigdecimal

为什么下面的代码会抛出一个java数字格式异常?

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

3 个答案:

答案 0 :(得分:14)

是的,BigDecimal类在其Locale的构造函数中不考虑任何String,可以在此构造函数的Javadoc中读取:

  

该分数由小数点后跟零或更多组成   十进制数字。

如果要根据使用逗号作为小数分隔符的其他Locale进行解析,则需要将java.text.DecimalFormat与特定Locale一起使用。

示例:

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

注意:您需要获取DecimalFormatNumberFormat的子类)的实例才能调用方法setParseBigDecimal。否则,它将返回Double,它是二进制浮点数和二进制浮点数cannot accurately represent many decimal fractions。因此,在许多情况下会导致精度下降。

答案 1 :(得分:8)

问题是BigDecimal的构造函数需要十进制数格式,其中小数点位于小数点.之后,而不是十进制逗号,,因此这种特定情况的正确格式为:

BigDecimal d = new BigDecimal("10934.375");

答案 2 :(得分:3)

您可以使用NumberFormat选择区域设置,请参阅示例:

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